主要内容

parforル,プ内の変数のトラブルシュ,ティング

parforル,プの変数が連続的に増加する整数であることの確認

parforル,プ内のル,プ変数は,連続的に増加する整数でなければなりません。このため,次の例はエラ,を返します。

parforI = 0:0.2:1%非整数parforJ = 1:2:11%非连续parforK = 12:-1:1%不增加
ル,プ変数を有効な範囲に変換することで,これらのエラ,を修正できます。たとえば,非整数の例を次のように修正できます。
iValues = 0:0.2:1;parforidx = 1: i = iValues(idx);...结束

parforル,プでのオ,バ,フロ,の回避

MATLAB®parforル,プ変数のオ,バ,フロ,する可能性を検出すると,エラ,を報告します。

オ,バ,フロ,条件 解決法

parforル,プの範囲の長さがル,プ変数の型の最大値を超えている。

以下で,长度(128:127)> maxint(“int8”)であるため,matlabはエラ,を報告します。

parforidx = int8 (128:127) idx;结束

より大きなデ,タ型をparforル,プ変数に使用します。計算で元のデ,タ型を保持する場合は,parforル,プ内でparforル,プ変数を変換します。

parforidx = 128:127 int8 (idx);结束

parforル,プの範囲の初期値が,ル,プ変数の型の最小値に等しい。

以下で,0 = intmin(“uint32”)であるため,matlabはエラ,を報告します。

parforidx = uint32 (0:1) idx;结束

  • 前述の解決策と同じように,より低い最小値をもより大きなデタ型を使用します。

  • 値の範囲を@ @ンクリメントします。以下に例を示します。

    parforidx = uint32 (0:1) + 1 idx-1;结束

parforル,プ内の変数分類の問題の解決

MATLABがparforループ内の名前を変数として認識すると,その変数は次の表に示す複数のカテゴリのいずれかに分類されます。変数が一意に分類され,カテゴリ要件を満たすことを確認してください。要件に違反するparforル,プはエラ,を返します。

分類 説明
ル,プ変数 ルプンデックス
スラ@ @ス化された変数 そのセグメントがル,プの異なる反復で演算される配列
ブロ,ドキャスト変数 ル,プの前に定義される変数。その値はル,プ内に必要ですがル,プ内で割り当てられることはありません。
リダクション変数 ル,プの反復を通して値を累積する変数。反復の順序は考慮されません。
一時変数 ル,プ内で作成される変数。ルプ外ではアクセスできません。

使用している変数を確認するには,コ,ドフラグメントを調べます。表内のすべての変数分類がこのコ,ドに示されています。

変数分類の問題が生じた場合は,parforル,プの本体を関数に変換するさらに難しい方法を用いる前に,以下の方法を検討してください。

  • 入れ子にされたル,プを使用して,スラ,parforル,プ内の他の場所でその配列を使用することはできません。左側のコ,ドは機能しません。一个がスラesc escス化されており,入れ子にされたルプ内でンデックスが付けられているためです。右側のコ,ドは機能します。入れ子にされたルプの外側でv一个に代入されているためです。1行全体を計算してから,スラescス化された出力への代入を一度に実行できます。

    無効 有効
    A = 0 (4,10);parforI = 1:4A(i, j) = i + j;结束disp((我,1))结束
    A = 0 (4,10);parforI = 1:4 v = 0 (1,10);J = 1:10 v(J) = I + J;结束dip (v(1)) A(i,:) = v;结束

  • 左側のコ,ドは機能しません。parfor内の変数xを分類できないためです。この変数が分類できない理由は,xの異なる部分への代入が複数あるためです。したがって,parforはル,プの反復間に依存関係があるかどうかを判定できません。右側のコ,ドは,xの値を完全に上書きしているため機能します。これでparforは,xが一時変数であると明確に判定できます。

    無効 有効
    parforIdx = 1:10 x(1) = 7;X (2) = 8;Out (idx) = sum(x);结束
    parforIdx = 1:10 x = [7,8];Out (idx) = sum(x);结束

  • 次の例では,構造体配列のフィ,ルドをスラ,ス化する方法を説明します。詳細にいては,结构体を参照してください。左側のコ,ドは機能しません。parfor内の変数一个を分類できないためです。この変数を分類できないのは,aapl . exeンデックス付けの形式が,スラaapl . exeス化された変数では無効なためです。一个のフィ,ルドxが正しくスライス化されているように見えますが,第1レベルのインデックス付けはスライス化されたインデックス付け操作ではありません。右側のコ,ドは正しく機能します。结构体のフィ,ルドを別の変数tmpxに抽出しているためです。これでparforは,この変数がスラ。通常、结构体のフィルドやオブジェクトのプロパティを,スラス化された入力変数や出力変数としてparfor内で使用することはできません。

    無効 有効
    A.x = [];parfora.x(Idx) = 7;结束
    TMPX = [];parfortmpx(Idx) = 7;结束A.x = tmpx;

Parforル,プの構造体配列

一時変数としての構造体の作成

ドット表記の代入を使用してparforル,プ内に構造体を作成することはできません。左側のコ,ドでは,ル,プ内の両方の行で分類エラ,が発生します。右側のコ,ドでは,回避策として関数结构体を使用することで,ル,プ内または最初のフィ,ルド内に構造体を作成できます。

無効 有効
parforI = 1:4 temp.myfield1 = rand();Temp.myfield2 = i;结束
parforI = 1:4 temp = struct();Temp.myfield1 = rand();Temp.myfield2 = i;结束
parforI = 1:4 temp = struct(“myfield1”,兰德(),“myfield2”,我);结束

構造体フィルドのスラス化

構造体フィルドを,スラス化された“入力または出力”配列としてparforル,プ内で使用することはできません。。左側のコドでは,ンデックス付けが原因でルプ内の両方の行に分類エラが発生します。右側のコ,ドでは,スライス化された出力を回避するために、スライス化された別々の配列をループ内で使用します。そのうえで、ループの完了後に構造体フィールドを割り当てます。

無効 有効
parforoutputData.outArray1(i) = 1/i;outputData.outArray2(i) = i^2;结束
parforoutArray1(i) = 1/i;outArray2(i) = i^2;结束输出数据= struct(“outArray1”outArray1,“outArray2”, outArray2);

スラス化された入力の問題を回避するには,ルプの前に構造体フィルドを別の配列に割り当てます。この新しい配列はスラ@ @ス化された入力に使用できます。

inArray1 = inputData.inArray1;inArray2 = inputData.inArray2;parfori = 1:4 temp1 = inArray1(i);temp2 = inArray2(i);结束

parforル,プ本体から関数への変換

他のすべてが失敗した場合でも,parforル,プ本体を関数に変換することにより,parforル,プでの変数分類の問題を通常は解決できます。左側のコ,ドでは,コ,ドアナラ,ザ,が変数yの問題にフラグを設定しますが,この問題を解決することはできません。右側のコ,ドでは,parforル,プ本体を関数に変換することでこの問題が解決されます。

無効 有効
函数Parfor_loop_body_bad data = rand(5,5);均值= 0 (1,5);parforI = 1:5%代码分析器标记问题%,变量y如下Y.mean = mean(数据(:,i));均值(i) = y.均值;结束disp(意味着);结束
函数Parfor_loop_body_good data = rand(5,5);均值= 0 (1,5);parforI = 1:5而是调用一个函数means(i) = computeMeans(data(:,i));结束disp(意味着);结束这个函数现在包含body%的parfor循环函数mean = mean(数据);Means = y.mean;结束
使用“本地”配置文件启动并行池(parpool)…连接4个工人。0.6786 0.5691 0.6742 0.6462 0.6307

明確な変数名

parforループ内の変数としてMATLABで明確に識別できない名前を使用すると,関数を参照しているものと解析時に想定されます。その上で,実行に際して関数が見からないと,matlabでエラが発生します変数名を参照してください。たとえば,次のコ,ドでは,f (5)fという配列の5番目の要素を参照しているか,または引数5をもfという関数を参照しているかのいずれかです。fがコ,ド内で変数として明確に定義されていない場合,matlabではコ,ド実行時にパスで関数fを検索します。

parforI = 1:n...A = f(5);...结束

透過的なparforルプ

parforル,プ本体は“透過的”でなければなりません。まり,変数への参照はすべてコ,ドのテキストにおいて“可視”でなければなりません。透過性の詳細にいては,Parforル,プまたはSPMDステ,トメント内での透過性の確保を参照してください。

グロ,バル変数および永続変数

parforル,プの本体には,全球または持续的の変数宣言を含めることができません。

関連するトピック