Есть несколько ограничений (в дополнение к тем из блока Лорен, на который ссылается Джон):
- Ваш код должен выполняться внутри функции
- У вас не должно быть других псевдонимов«data»
«Псевдонимы» важны и потенциально трудны для понимания.MATLAB использует функцию копирования при записи, что означает, что при вызове функции передаваемый аргумент не дублируется немедленно, но может быть скопирован, если вы измените его в функции.Например, рассмотрим
x = rand(100);
y = myfcn(x);
% with myfcn.m containing:
function out = myfcn(in)
in(1) = 3;
out = in * 2;
end
. В этом случае переменная x
передается в myfcn
.MATLAB имеет семантику значений, поэтому любые изменения входного аргумента in
не должны отображаться в вызывающей рабочей области.Итак, первая строка myfcn
заставляет аргумент in
стать копией из x
, а не просто псевдонимом к нему.Посмотрите, что происходит с try
/ catch
- это может быть убийцей на месте, потому что MATLAB должен быть в состоянии сохранить значения, если вы допустите ошибку.Далее:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
arg = -arg;
end
, тогда должен получить оптимизацию на месте для x
в myouterfcn
.Но следующее не может:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
try
arg = -arg;
catch E
disp( 'Oops.' );
end
end
Надеюсь, что эта информация поможет ...