データのブロックをロードし、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
サイズが大きくなります (これは単純化されており、実際には複数の永続変数があります)。大きな変数を関数に出し入れするときにメモリやその他のオーバーヘッドの問題はありますか? さらに言えば、変数を毎回関数に渡すのではなく、永続変数を使用することで実際に何かを得られるのでしょうか?