我有一个带有GUI的脚本,该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
始终为true,因此总是在设置之前计算Z
。
问题是,有没有办法进入函数来清除主脚本中的持久变量?我想到的另一个选项是将持久变量添加到constants
结构变量中,但Z
很大(这是简化的,实际上有多个持久变量)。将大变量传入和传出函数时是否存在内存或其他开销问题?就此而言,我是否真的通过使用持久变量而不是每次都将变量传递给函数来获得任何东西?