2016-05-17 74 views
0

我試圖讓下面的循環並行友好的MATLAB,這樣我可以使用parforMATLAB切片可變環

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

我試圖根據MATLAB文檔切片變量發佈here

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循環,並把這些作爲索引表達式中的obj - 和它的結論是obj必須是parfor「播出」變量。您的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