在parfor中使用struct数组

时间:2013-05-21 11:56:50

标签: matlab parallel-processing

我在Matlab的parfor循环中使用struct数组时遇到了麻烦。以下代码有两个我不明白的问题:

s=struct('a',{},'b',{});
if matlabpool('size')==0
  matlabpool open local 2
end

for j = 1:2      
  parfor k=1:4
    fprintf('[%d,%d]\n',k,j)
    s(j,k).a = k;
    s(j,k).b = j;
  end
end
matlabpool close
  1. 失败,错误为Error using parallel_function (line 589) Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
  2. 在输出时,变量s是一个向量,而不是一个数组(因为它应该是,即使代码在完成之前中断)。
  3. 编辑如果我将struct数组初始化为正确的大小,问题就解决了:

    s=struct('a',cell(2,4),'b',cell(2,4));
    

    但是,我仍然很乐意获得有关问题的见解(例如,如奥列格·科马罗夫所建议的那样,它会反弹一个错误)

1 个答案:

答案 0 :(得分:3)

它最初对我来说很好,但后来我不知道会发生什么。一般来说,你需要小心parfor循环,并有足够的文档来说明如何对齐所有内容。两个不同的建议。 首先,更重要的是,parfor循环位于外部循环中:

function s = foo
s=struct('a',{},'b',{});

parfor j = 1:2      
  for k=1:4
    fprintf('[%d,%d]\n',k,j)
    s(j,k).a = k;
    s(j,k).b = j;
  end
end

二,Matlab对编写主要的退出变量非常挑剔(即parfor循环中包含的变量,在你的情况下,s被索引到循环中)。您首先要创建一个包含所有内部循环信息的虚拟变量,然后在循环结束时写入一次。例如:

function s = khal
s=struct('a',{},'b',{});


parfor j = 1:2 
   dummy=struct('a',{},'b',{});
  for k=1:4
    fprintf('[%d,%d]\n',k,j)
    dummy(k).a = k;
    dummy(k).b = j;
  end
  s(j,:) = dummy;
end

这里没有问题,但在其他情况下会变得复杂