parfor with nested for:变量分类依赖于循环endVal

parfor with nested for: variable classification depends on loop endVal

我想在像素索引 (ix,iy) 的两个嵌套循环中计算分形图像。示例代码只是给RGB值分配了一个随机数,而不是真正的计算。

x = 0:.2:4;
y = 0:.2:3;
nX = length(x);
nY = length(y);
RenderRed = zeros(nX,nY); RenderGreen = zeros(nX,nY); RenderBlue = zeros(nX,nY);

parfor ix = 1:nX
    % for iy = 1:length(y)  % error
    for iy = 1:nY
        % "compute" pixel (ix,iy)
        RenderRed(ix, iy) = rand; RenderGreen(ix, iy) = rand; RenderBlue(ix, iy) = rand;
    end
end

Pctr = [];
Pctr(:,:,1)=RenderRed; Pctr(:,:,2)=RenderGreen; Pctr(:,:,3)=RenderBlue;
handle = image(Pctr);
shg

代码如所示工作,但如果 iy 循环的结束值从 nY 更改为 length(y) - 请参阅注释行 - 发出错误:

Error: The variable RenderRed in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".

为什么?在我对切片变量的理解中,没有任何版本应该起作用:必须使用一个辅助变量来收集内部循环的结果,并将其分配给矩阵的一部分。 但是 length(y) 而不是 nY 应该对变量的分类没有任何影响,因为 y 永远不会在循环中分配。

mlint 在两个版本中都没有发现错误。与 MATLAB 版本 2016b、2017b 的行为相同。

根据Matlab documentation,这实际上可以工作!当您想在 parfor 循环中使用嵌套的 for 循环时:

For proper variable classification, you must define the range of a for-loop nested in a parfor-loop by constant numbers or variables.