1

データのブロックをロードし、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

問題は、関数に到達して、メイン スクリプトから永続変数をクリアする方法があるかどうかです。私が考えたもう 1 つのオプションは、永続変数をconstants構造変数に追加することでしたが、Zサイズが大きくなります (これは単純化されており、実際には複数の永続変数があります)。大きな変数を関数に出し入れするときにメモリやその他のオーバーヘッドの問題はありますか? さらに言えば、変数を毎回関数に渡すのではなく、永続変数を使用することで実際に何かを得られるのでしょうか?

4

1 に答える 1

3

をご覧くださいclear。関数の名前を渡すと、関数内のすべての永続変数が再初期化されます。

于 2013-09-26T17:54:33.487 に答える