ちょうど私の2セント:@ mmumbosはすでに説明したように、達成しようとしていることはこのようにはできませんが、一定の回避策が適用されます。
のは、あなたが(行列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
次に、あなたを行列B
を実際に構築する必要はありません。あなたは、次のように簡単に構成された「」インデックステーブル「」を使用してB_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
の実装を改善するまでは、そのような回避策は(残念ながら)例ロットで必要になります。
ループ内に他のインデックス変数を設定できないようです。参照してください:http://www.mathworks.com/matlabcentral/newsreader/view_thread/162203 – cyang
どのバージョンのmatlabを使用していますか? – alrikai
MATLABの私のバージョンでは持っていませんが、私は 'parpool'を見てみる価値があると思います - http://www.mathworks.it/it/help/distcomp/parpool.html –