2016-05-17 25 views
0

は私がparforを使用できるようにMATLABで並列に優しい、次のループを作るしようとしていますループMATLABスライス変数が

parfor ivert = 1 : nVerts 
    i = obj.neighIDs{ ivert }; 
    b = obj.f(i); 
    A = obj.coeffMatrix{ ivert } 
    x = A \ b; 
    obj.solution(ivert, :) = x(1 : 3); 
end 

しかし、MATLABは文句を言うこと:

Valid indices for `obj` are restricted in PARFOR loops. 

誰かが私に上記のループの変数をスライスする方法のヒントを教えてもらえますか?

+1

'obj.f(I)のインデックス'問題がある可能性があります。 Matlabはループ内のインデックスを計算するのは不幸だと思います。 –

答えて

2

ここでの問題は、MATLABは、あなたのparforループの最初の3行を見て、obj上のインデックス式としてそれらを扱うことである - そしてそれはobjparfor「放送」の変数でなければならないと結論します。 parforループの最終行は、objのフィールドへのインデックス付き割り当てのように見えますが、objへのインデックス付き割り当てとして扱われます。 objは「ブロードキャスト」に分類されているため、割り当てられません。この問題を解決するために、私はこのような何かをやってお勧めします:

tmpSolution = zeros(nVerts, 3); 
parfor ivert = 1:nVerts 
    ... %# calculate 'x' 
    tmpSolution(ivert, :) = x(1:3); 
end 
obj.solution = tmpSolution; 
+0

ありがとうございます。 'x'を計算して' parfor'で使うために関数を定義することをお勧めしますか? – AFP

+0

残念ながら、私は 'tmpSolution'を定義することで問題を解決することができませんでした。 – AFP

+0

残りのエラーは何ですか? 'parfor'ループ内の' obj.solution(...)= ... '行を私の提案に置き換えましたか?私はあなたのコードを実行することはできませんが、その変更は静的解析の問題を取り除く... – Edric

関連する問題