在parfor中使用struct数组

Ita*_*atz 5 parallel-processing matlab

我在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
Run Code Online (Sandbox Code Playgroud)
  1. 它失败并出现错误 Error using parallel_function (line 589) Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
  2. 在输出时,变量s是一个向量,而不是一个数组(因为它应该是,即使代码在完成之前中断).

编辑问题解决了如果我将struct数组初始化为正确的大小,通过:

s=struct('a',cell(2,4),'b',cell(2,4));
Run Code Online (Sandbox Code Playgroud)

但是,我仍然很乐意得到关于这个问题的见解(例如,它是一个bug,如Oleg Komarov所建议的那样)

Ras*_*man 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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