用于PARFOR循环的MATLAB切片变量

时间:2016-05-17 00:41:48

标签: matlab for-loop parallel-processing 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

我尝试根据发布的here

的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 个答案:

答案 0 :(得分:2)

问题在于,MATLAB会看到obj循环的前三行,并将其视为obj上的索引表达式 - 并得出parfor必须是{{}的结论1}}“广播”变量。 parfor循环的最后一行被视为obj的索引赋值(即使它看起来像是obj字段的索引赋值)。由于obj已被归类为“广播”,因此您无法分配。要解决这个问题,我建议你这样做:

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