parfor循环有错误的切片变量

时间:2013-11-01 13:19:45

标签: matlab parfor

任何人都可以向我解释,为什么以下内容会导致uh

错误
max_X = 100;
max_Y = 100;
h = ones(max_Y,max_X);
u = zeros(max_Y,max_X);

parfor l=1:max_X*max_Y
i = mod(l-1,max_X) + 1;
j = floor((l-1)/max_Y) + 1;
  for k=1:9
    m = i + floor((k-1)/3) - 1; 
    n = j + mod(k,-3) + 1;
    h_average(k) = sqrt(h(i,j)*h(m,n));
    u_average(k) = (u(i,j)*sqrt(h(i,j)) + u(m,n)*sqrt(h(m,n)))/(sqrt(h(i,j)) + sqrt(h(m,n)));
  end
end

我现在可以用(i,j)替换(l),但即使我尝试计算相关变量,也可以根据p将其称为(m,n),然后写{ {1}}而不是u(p)它会给我一条错误消息。 它只强调u(m,n),分别为。 u(m,n)但不是u(p)。 MATLAB说:

  

说明:   为了使MATLAB有效地执行h(m,n)循环,发送给MATLAB工作人员的数据量必须最小。 MATLAB实现这一目标的方法之一是限制变量在parfor次迭代中的索引方式。指示变量的索引方式与parfor不兼容。    建议采取的行动   修复索引。有关索引限制的说明,请参阅并行计算工具箱文档中的“切片变量”

任何想法,这里有什么不对?

1 个答案:

答案 0 :(得分:2)

uh的问题是它们都作为广播变量发送到PARFOR循环。这不是错误 - 它只是一个警告,表明发送的数据超出了其他可能的数据。

PARFOR循环无法运行,因为您正在编制索引但未切片u_averageh_average。由于每次都覆盖u_averageh_average,所以不清楚你想要从这个循环中得到什么输出,因此PARFOR循环是没有意义的。