5

我在 Matlab 的 parfor 循环中使用结构数组时遇到问题。以下代码有2个我不明白的问题:

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是一个向量,而不是一个数组(它应该是,即使代码在完成之前中断)。

编辑如果我将结构数组初始化为正确的大小,问题就解决了,方法是:

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

但是,我仍然很乐意获得有关该问题的见解(例如,它是否像 Oleg Komarov 所建议的那样集结了一个错误)

4

1 回答 1

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

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

于 2013-05-21T19:51:13.980 回答