Main Content

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

関連するトピック