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;
Другие вопросы по тегам