parfor
ループでのオブジェクトおよびハンドルの使用
オブジェクト
parfor
ループの実行に際し、ブロードキャスト変数またはスライス化された入力変数をクライアントからワーカーに送信し、スライス化された出力変数をワーカーからクライアントに送り返すことができます。ワーカーとの間で送受信する各オブジェクトについて、関数 save
と関数 load
がサポートされている必要があります。詳細については、オブジェクトの保存と読み込みのプロセスを参照してください。
オブジェクトのスライス化されたプロパティ、または構造体のスライス化されたフィールドへの値の代入は、parfor
ループではサポートされていません。
無効 | 有効 |
---|---|
s = struct; parfor i = 1:4 s.SomeField(i) = i; end | parfor i = 1:4 x(i) = i; end s = struct('SomeField',x); |
第 1 レベルのインデックス付けの制約の詳細については、スライス化された変数を参照してください。
ハンドル クラス
ハンドル オブジェクトを parfor
ループ本体への入力として送信できます。ただし、ループ反復中にワーカー上でハンドル オブジェクトに対し行われる変更は、クライアントに自動的には伝播し返されません。すなわち、ループ内に対して行われた変更は、ループを抜けた後に自動的に反映されません。
ループの後でクライアントに変更を反映させるには、変更されたハンドル オブジェクトを、parfor
ループの出力変数に明示的に代入します。次の例で、maps
はスライス化された入出力変数です。
maps = {containers.Map(),containers.Map(),containers.Map()}; parfor ii = 1:numel(maps) mymap = maps{ii}; % input slice assigned to local copy for jj = 1:1000 mymap(num2str(jj)) = rand; end maps{ii} = mymap; % modified local copy assigned to output slice end
関数ハンドルを参照するスライス化された変数
ループ インデックスを入力引数に指定して関数ハンドルを直接呼び出すことはできません。この変数をスライス化された入力変数と区別できないためです。ループ インデックス変数を引数に指定して関数ハンドルを呼び出さなければならない場合は、feval
を使用します。
次の例では、関数ハンドルと for
ループを使用しています。
B = @sin; for ii = 1:100 A(ii) = B(ii); end
これに対応する parfor
ループでは、B
が関数ハンドルを参照できません。回避方法として、feval
を使用します。
B = @sin; parfor ii = 1:100 A(ii) = feval(B,ii); end