Matlab 无法使用parfor写入矩阵行

Matlab 无法使用parfor写入矩阵行,matlab,parfor,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]; % w

如何使用
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
由于变量“PP”的使用方式,PARFOR循环无法运行

我实际上是说“有效的索引被限制在PARFOR循环中”。它说的原因是MATLAB不连续地迭代一个
parfor
循环,这意味着它可以按半随机顺序进行迭代,如
52413
,而不是
12345
。这意味着,为了知道MATLAB在
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矩阵中,它只存储一个双精度,可以通过简单地读取
PP(x,y)
来索引。因此,存储相同数量的有用数据需要3倍的内存。

我实际上是说“有效索引限制在PARFOR循环中”。它说的原因是MATLAB不连续地迭代一个
parfor
循环,这意味着它可以按半随机顺序进行迭代,如
52413
,而不是
12345
。这意味着,为了知道MATLAB在
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矩阵中,它只存储一个双精度,可以通过简单地读取
PP(x,y)
来索引。因此,存储相同数量的有用数据需要花费3倍的内存。

与其生成索引数组,不如说只是在
I=1:area
上循环,然后使用
ind2sub([xCount,yCount],I)
找到相应的x,y值。这样的话,
PP(i)
的赋值就可以被Matlab清晰地拼接了。谢谢!但我真的不同意Matlab团队的观点。在C#中,我能够做到这一点。Matlab的家伙们添加了一些额外的保护层,我认为这只是废话!!我的id计算是正确的,所有id都是唯一的。真的,这太臭了@Pedro77我对MATLAB的内部引擎不是很在行,但我猜当两个工人试图同时访问同一个元素时,下腹部会出问题,因此它希望事先知道所有索引都是唯一的。至于为什么它不像C#,简单,MATLAB~=C#。额外的糟糕的保护层。不直观。错误的文档。感谢stackoverflow和你,我得到了答案。再次感谢。其实也是不行的。只有Javier注释起作用。我不想生成一个索引数组,而是说只是在
I=1:area
上循环par,然后使用
ind2sub([xCount,yCount],I)
找到相应的x,y值。这样的话,
PP(i)
的赋值就可以被Matlab清晰地拼接了。谢谢!但我真的不同意Matlab团队的观点。在C#中,我能够做到这一点。Matlab的家伙们添加了一些额外的保护层,我认为这只是废话!!我的id计算是正确的,所有id都是唯一的。真的,这太臭了@Pedro77我对MATLAB的内部引擎不是很在行,但我猜当两个工人试图同时访问同一个元素时,下腹部会出问题,因此它希望事先知道所有索引都是唯一的。至于为什么它不像C#,简单,MATLAB~=C#。额外的糟糕的保护层。不直观。错误的文档。感谢stackoverflow和你,我得到了答案。再次感谢。其实也是不行的。只有Javier评论有效。