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.
我想在像素索引 (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.