は最もよく私が言うことができるように、これはとの問題のように見える... MATLABバージョンR2016bに基づいており、次の正確にbroadcastのMATLABの能力は、特定のクラスオブジェクトをparfor
の労働者に提供します。 fitoptions
関数は、あなたの例でクラスcurvefit.nlsqoptions
のオブジェクトを返します。 Curve Fitting Toolboxコードを見れば、これらのオブジェクトは古いUDDクラスシステムを使用して定義されていることがわかります(Donn Shullによる良い紹介はUndocumented MATLABにあります)。新しいMCOS(MATLABクラスオブジェクトシステム)は長年前に導入されましたが、UDDを使用して定義された多くのオブジェクトを見つけることができます。あなたの例で
、fitopt
は、労働者のそれぞれにbroadcast(つまりコピー)、代わりfitopt
がparfor
ループ内[]
に設定されなければなりません。新しいクラスシステム(例えば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
はい、私はそれが動作することを確認できます。私はfitoptのリストを用意してループの中で使っていました。ご協力ありがとうございました! –