2017-10-25 2 views
1

私は並列処理を使用してMATLABで大量のデータを高速化しようとしていますが、私は非常に奇妙な問題に直面しています。fitoptionは内部でクリアされていますか?

私は、誰かが何が起こっているかについての手がかりを持っているかもしれないことを望んで、問題を切り離そうとしました。ここではサンプルコードです:

f = @(a, x) a*x; 
fitopt = fitoptions(f); 

for i = 1:5 
    disp(fitopt); 
end 

私は上記のコードを実行した場合、fitoptの内容は予想通り5回書き込まれます。しかし、forparforループに置き換えると、fitoptは空に設定され、何も表示されません。

何が問題になる可能性がありますか?

私の設定:Windows 7でのMATLAB 2014A、64ビット

答えて

2

は最もよく私が言うことができるように、これはとの問題のように見える... MATLABバージョンR2016bに基づいており、次の正確にbroadcastのMATLABの能力は、特定のクラスオブジェクトをparforの労働者に提供します。 fitoptions関数は、あなたの例でクラスcurvefit.nlsqoptionsのオブジェクトを返します。 Curve Fitting Toolboxコードを見れば、これらのオブジェクトは古いUDDクラスシステムを使用して定義されていることがわかります(Donn Shullによる良い紹介はUndocumented MATLABにあります)。新しいMCOS(MATLABクラスオブジェクトシステム)は長年前に導入されましたが、UDDを使用して定義された多くのオブジェクトを見つけることができます。あなたの例で

fitoptは、労働者のそれぞれにbroadcast(つまりコピー)、代わりfitoptparforループ内[]に設定されなければなりません。新しいクラスシステム(例えばfittypeで作成されたもの)のように定義された別のクラスオブジェクトでこれを試してみると、放送は正常に動作します。たとえば、このテストコード:

f = @(a, x) a*x; 
uddObj = fitoptions(f); 
mcosObj = fittype(f); 

parfor i = 1:3 
    fprintf('\nWorker %d:\n', i); 
    uddObj 
    mcosObj 
end 

は、この出力を生成します

Worker 2: 

uddObj = 
    [] 

mcosObj = 
    General model: 
    mcosObj(a,x) = a*x 

Worker 1: 

uddObj = 
    [] 

mcosObj = 
    General model: 
    mcosObj(a,x) = a*x 

Worker 3: 

uddObj = 
    [] 

mcosObj = 
    General model: 
    mcosObj(a,x) = a*x 

だから、要するに、parforループが正しくUDDスタイルオブジェクトを放送することができないことが表示されます。回避策の一つは、放送を避け、のparforループ内でこれらのオブジェクトを作成するには、次のようになります。

f = @(a, x) a*x; 

parfor i = 1:5 
    fitopt = fitoptions(f); % Function handle f broadcasts just fine 
    disp(fitopt); 
end 

あなたはまたにそのあなたのインデックスオブジェクトの配列を作成することにより、sliced variableを作成することができます。

f = @(a, x) a*x; 
fitopt = repmat(fitoptions(f), [1 5]); 

parfor i = 1:5 
    disp(fitopt(i)); 
end 
+1

はい、私はそれが動作することを確認できます。私はfitoptのリストを用意してループの中で使っていました。ご協力ありがとうございました! –

関連する問題