Выполнение всех дел один за другим внутри цикла for в октаве - PullRequest
0 голосов
/ 12 февраля 2019

До сих пор я меняю req вручную.Код работает, в том числе сохранение результата в файл.Но теперь я хочу запустить код для всех возможных значений req.

Не сохраняя его в файл, код работает, но, очевидно, он перезаписывает результат.Вот почему я поместил эту строку кода, чтобы сохранить результат, присвоив ему другое имя в зависимости от значений req.Но это дает мне ошибку.

ошибка:

error: sprintf: wrong type argument 'cell'
error: called from
    testforloop at line 26 column 1

мой код:

clear all;
clc;

for req = {"del_1", "del_2", "del_3"}

request = req;

  if (strcmp(request, "del_1"))
  tarr = 11; 
  # and a bunch of other variables
  elseif (strcmp(request, "del_2"))
  tarr = 22; 
  # and a bunch of other variables
  elseif (strcmp(request, "del_3"))
  tarr = 33; 
  # and a bunch of other variables
  else
  # do nothing
  endif


#long calculation producing many variable including aa, bb, cc.
aa = 2 * tarr;
bb = 3 * tarr;
cc = 4 * tarr;

#collecting variables of interest: aa, bb, cc and save it to a file.
result_matrix = [aa bb cc];
dlmwrite (sprintf('file_result_%s.csv', request), result_matrix);

endfor

, если я использую ["del_1" "del_2" "del_3"], ошибка

1017 *

1 Ответ

0 голосов
/ 12 февраля 2019

Внутри цикла

for req = {"del_1", "del_2", "del_3"}

req получает в качестве значения каждую из ячеек массива ячеек, а не содержимое ячеек (странное проектное решение, IMO, но так оно и работает)).Таким образом, req={"del_1"} в первой итерации.Сама строка затем может быть получена с помощью req{1}.Таким образом, все, что вам нужно изменить, это:

request = req{1};

Однако я бы реализовал это по-другому, например:

function myfunction(request, tarr)
  % long calculation producing many variable including aa, bb, cc.
  aa = 2 * tarr;
  bb = 3 * tarr;
  cc = 4 * tarr;

  % collecting variables of interest: aa, bb, cc and save it to a file.
  result_matrix = [aa bb cc];
  dlmwrite (sprintf('file_result_%s.csv', request), result_matrix);
end

myfunction("del_1", 11)
myfunction("del_2", 22)
myfunction("del_3", 33)

Я думаю, это дает более четкое представление о том, что вына самом деле, код менее сложен.


Обратите внимание, что в Octave ["del_1" "del_2" "del_3"] оценивается как "del_1del_2del_3".То есть вы соединяете строки.В MATLAB это не так, но Octave не знает тип string и использует " так же, как ', для создания char массивов.

...