我有一个带有 GUI 的脚本,它加载一个数据块,然后使用lsqnonlin
. 模型函数需要一些在迭代之间不会改变的辅助计算(权重函数、表查找等),所以我在一开始就计算它们,然后将它们存储在持久变量中。到目前为止,一切都很好。
但是,一旦我将控制权返回给我的 GUI 并想要适应下一组数据,这些持久变量仍然存在,并且可能不适合下一个数据集。我尝试将标志传递给我的拟合函数,让它知道是否清除。我当前的代码看起来像这样(大大简化):
constants.firstRun = true;
constants.otherStuff = [other stuff I need for fit];
for k = 1:K
data = load(dataFile(k))
[N,M] = size(data);
if k == 1
normalizedIndex = linspace(0,1,N);
end
for m = 1:M
dataToFit = data(:,m)
constants.dataToFit = dataToFit;
if k == 1 && m == 1
Ao = estimateStartingParameters(normalizedIndex,dataToFit);
else
Ao = A;
end
nlFitFun = @(ao) modelFunction(ao,normalizedIndex,constants);
A = lsqnonlin(nlFitFun,Ao);
% do things with A like calculate, plot, save etc.
constants.firstRun = false;
end
end
然后模型函数看起来像
function Y = modelFunction(ao,normalizedIndex,constants)
persistent Z
if constants.firstRun
Z = longCalculation(constants.otherStuff);
end
X = calculation(ao,Z,normalizedIndex);
Y = fullModel(ao,X,constants) - constants.dataToFit;
这里的问题是,对于第一次拟合,constants.firstRun
总是正确的,所以它总是Z
在被设置之前计算,。
问题是,有没有办法进入函数以从主脚本中清除持久变量?我想到的另一个选择是将持久变量添加到constants
结构变量中,但是Z
很大(这被简化了,实际上有多个持久变量)。将大变量传入和传出函数时是否存在内存或其他开销问题?就此而言,我是否真的通过使用持久变量而不是每次都将变量传递给函数来获得任何东西?