如何使用parfor
写入结果矩阵行?
代码示例:
xCount = 10;
yCount = 20;
area = xCount*yCount;
PP = nan(area,3);
parfor x = 1:10
for y = 1:20
id = y + (x-1)*yCount; % global PP line id.
z = x^2+y*10; % my stuff to get Z.
PP(id,:) = [x y z]; % write to PP line
end
end
PARFOR循环无法运行,因为变量' PP'使用。
答案 0 :(得分:3)
我实际上说"有效指数在PARFOR循环中被限制"。之所以说它是MATLAB迭代非parfor
循环非连续,这意味着它可以像5 2 4 1 3
那样以半随机顺序进行迭代,而不是1 2 3 4 5
。这意味着为了知道在PP
MATLAB中存储结果的位置,它想在进入并行环境之前知道不同的迭代不会调用任何行,以避免在从工作者返回结果时发生冲突
解决方案是以预先知道索引存储位置的方式构造PP
,例如通过在循环之前创建一个2D数组来存储东西:
xCount = 10;
yCount = 20;
area = xCount*yCount;
PP(xCount,yCount) = 0;
y=1:yCount;
parfor x = 1:xCount
z = x^2+y.*10; % my stuff to get Z.
PP(x,:) = z; % write to PP line
end
%// Go to the [x y z] format
PP = [repmat((1:yCount).',xCount,1),repmat((1:xCount).',yCount,1), PP(:)];
我个人不会在这种情况下执行最后一行,因为它为每个有用值(z
)存储了三个双精度数,而在循环中出现的2D矩阵中它只存储了1个可以通过简单地阅读PP(x,y)
来索引的双精度数。因此,存储相同数量的有用数据需要花费3倍的内存。