MATLAB Переменная нарезки для циклов PARFOR
Я пытаюсь сделать следующий цикл параллельным в MATLAB
так что я могу использовать parfor
:
for ivert = 1 : nVerts
b = obj.f( obj.neighIDs{ ivert } );
x = obj.coeffMatrix{ ivert } \ b;
obj.solution( ivert, : ) = x( 1 : 3 );
end
Я попытался нарезать переменные в соответствии с документацией 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 ответ
Проблема в том, что 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;