无法使用parfor写入矩阵行

时间:2016-05-15 19:20:50

标签: matlab parfor

如何使用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'使用。

1 个答案:

答案 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倍的内存。