9

matlab で parfor を使用して、この単純なコードで何が起こっているか知っている人はいますか? ありがとう、

行列を 4 つの配列にスライスし、各配列の要素を個別に更新したい

ここに簡単なバージョンがあります:

a = zeros(4,4);  
parfor i = 1:4  
    j = 2;      
    a(j,i) = 3;  
end

エラー: 'a' の有効なインデックスは parfor ループで制限されています。

でも、

これは機能します:

a = zeros(4,4);  
parfor i = 1:4  
    a(2,i) = 3;  
end

同じエラーのある別の単純な非動作バージョン:

a = zeros(4,4);  
parfor i = 1:4  
    a(i,i) = 3;  
end

私のアプリケーションでは、インデックス j は、いくつかのアルゴリズムを介して配列ごとに個別に生成されます

4

3 に答える 3

3

私の2セント:@mmumbosがすでに説明したように、あなたが達成しようとしていることはこの方法では不可能ですが、特定の回避策はまだ適用できます.

次のようなものを実装する必要があると仮定しましょう (これは、 matrix の線形変換の順列ですA)。

n=10;
A=rand(n,n);
B=zeros(n,n);
parfor i=1:n,
  j=(i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5));
  B(j,i) = my_function(A(i,:));
end

代わりに次のことを試してください。

parfor i=1:n,
  B_temp(i,:) = my_function(A(i,:));
end

次に、実際に matrix を作成する必要はありませんBB_temp次のように単純に構築された「インデックステーブル」を使用してアクセスできます。

J=zeros(n,1);
parfor i=1:n,
  J(i) = (i<=5)*(2*(i-1)+1)+(i>5)*(2*(i-5));
end

その後B(i)、 経由でアクセスしB_temp(J(i))ます。

最後の(カウンター)例を再訪して、それを回避する方法を見てみましょう。

n=4;
diag_A = zeros(n,1);
parfor i=1:n,
    diag_A(i)=3; % or any function of i
end

次に、 の ''i'' 番目の対角要素にアクセスする必要があるときはいつでも、A代わりに にアクセスしますdiag_A(i)。このような場合、次の行に沿って関数を作成すると便利です。

function a = access_matrix(A, diag_A, i, j)
  if (i!=j), 
    a = A(i,j);
  else
    a = diag_A(i);
  end
end

MATLAB が の実装を改善するまではparfor、(残念ながら) 多くの場合、このような回避策が必要になります。

于 2014-09-23T19:34:35.417 に答える
2

あなたが達成しようとしていることは不可能のようです。

matlabのドキュメントによると:

ループ変数とともに他の変数を使用して配列にインデックスを付ける場合、ループ内でこれらの変数を設定することはできません。実際には、そのような変数は、parfor ステートメント全体の実行にわたって一定です。ループ変数をそれ自体と組み合わせてインデックス式を形成することはできません。

MATLAB ドキュメンテーション ソース

したがって、ループ変数以外の配列のインデックスに使用するすべての変数は、ループ全体で一定である必要があります。

于 2013-03-23T14:50:01.597 に答える
1

まだ言及されていないため、これらのタイプの問題を診断するのに非常に役立つリンクを次に示します: Parfor での変数の分類。これらの問題は、MATLAB がそのページで説明されている厳密な定義に変数を分類できない場合に発生します。

ここで起こっていることは、ループの前に「スライス変数」 A をスライスする方法がわからないということです。並列実装を自分でプログラミングすることを考えてみてください。あなたがしたいことは、Aを他のプロセッサが触れないことがわかっている均等な部分に分割し、それらを別のCPUに渡して独立して動作させることです。MATLAB はループを調べますが、プログラムを実行するまで j が何であるかがわからないため、これを行う方法がわかりません。これは MATLAB の制限です。A(i*j,:) のような複雑な係数を使用すると、同じことが起こる別のケースがあります。繰り返しますが、それを分割する方法がわかりません。

于 2016-01-21T20:25:34.520 に答える