【问题标题】:Can I clear a persistent variable in workspace A from workspace B?我可以从工作区 B 中清除工作区 A 中的持久变量吗?
【发布时间】:2013-09-26 17:47:34
【问题描述】:

我有一个带有 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 很大(这被简化了,实际上有多个持久性变量)。将大变量传入和传出函数时是否存在内存或其他开销问题?就此而言,我是否真的通过使用持久变量而不是每次都将变量传递给函数来获得什么?

【问题讨论】:

    标签: matlab


    【解决方案1】:

    看看clear。如果您将函数名传递给它,它将重新初始化函数内的所有持久变量。

    【讨论】:

    • 这是 OP 需要的。你刚刚打败了我。 :)
    • 成功了!在我的辩护中,我有 2013a 并且clear 的帮助文件对此一无所知。 “如果名称是函数名称,则清除名称重新初始化函数中的任何持久变量”行。是 2013b 帮助文件的新内容。
    猜你喜欢
    • 1970-01-01
    • 2012-04-11
    • 2012-07-14
    • 1970-01-01
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多