У меня есть сценарий, который может быть прерван из-за длительного времени исполнения и продолжен позже. Давайте предположим, что это выглядит как это:MATLAB: сценарий vs функция относительно вывода-аргумента
data = []; % can't preallocate as I don't know the number of entries yet here...
while(1)
% ...
data = [data; someNewEntry];
end
Хорошая вещь об этом является то, что при работе в качестве сценария, когда я прервать его, я имею в тэ рабочую переменную data
.
Но я хотел преобразовать его в функцию, потому что сценарий имеет довольно большое количество переменных и помешает моей рабочей области с ней. Предположим теперь я преобразовал его так:
function data = myFnc()
data = []; % can't preallocate as I don't know the number of entries yet here...
while(1)
% ...
data = [data; someNewEntry];
end
Проблема Nnow: Когда я прервать функцию, я теряю все записи в data
, которые были сделаны до этого момента. Как решить эту проблему и вернуть текущий вектор data
при прерывании функции? Единственным возможным решением я придумал, чтобы использовать что-то вроде этого, чтобы использовать в для цикла:
if(nargout == 1)
assignin('caller','data', data);
end
Но как-то мне не нравится этот подход слишком много. Но все в порядке, мне кажется. Но об этом мне все еще не нравится: при использовании этого я всегда присваиваю данные рабочей области-var data
, так как я не знаю, как получить имя выходной переменной вызывающего абонента (т.е. bla = myFnc()
-> это будет bla
, таким образом assignin('caller','bla', data);
). Я знаю, что есть функция matlab inputnames()
, но я не смог найти эквивалент для выходных варов. Большое спасибо!
Sidenote, если 'someNewEntry' является скаляром, например. Вы можете увеличить 'data' более эффективно, используя:' data (end + 1) = someNewEntry' –
Спасибо за это, но на самом деле это вектор, создающий матрицу данных :) Но все же хорошо знать – tim
В этом случае это будет «data (end + 1, :) = someNewEntry». –