Matlab 在parfor中使用结构数组

Matlab 在parfor中使用结构数组,matlab,parallel-processing,Matlab,Parallel Processing,我在Matlab的parfor循环中使用结构数组时遇到问题。以下代码有两个我不理解的问题: 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 clos

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

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
  • 它使用并行_函数(第589行)失败,出现错误
    error
    等号右侧的输出数量不足,无法满足分配。
  • 在输出时,变量
    s
    是一个向量,而不是一个数组(应该是这样的,即使代码在结束前中断)
  • 编辑如果我通过以下方式将结构数组初始化为正确的大小,问题就会得到解决:

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

    但是,我仍然很乐意了解这个问题(如Oleg Komarov建议的是一个bug)

    它最初对我来说运行良好,但我不知道会发生什么。一般来说,您需要小心使用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
    )时非常挑剔。首先要创建一个包含所有innerloop信息的伪变量,然后在循环结束时向其写入一次。例如:

    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
    

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

    对于第2点,“数组”而不是“向量”是什么意思?在Matlab中没有区别。在我看来,
    s
    应该是这个代码末尾的
    struct
    s的2x4矩阵。我认为这实际上是一个bug,我建议提交一个并让我们保持更新。@jazzbassrob,向量是1xd数组(或dx1)。为什么parfor应该在外循环中?如果索引[1,2]上有外循环,索引[1,…,1000]上有内循环,那么较长的内循环将不会被并行化,是吗?拥有parfor循环会有开销成本,并且在某些情况下,将其放入内循环(特别是如果您有两个以上的池在运行)会有成本效益,但通常,您应该构造代码,使parfor循环位于外部循环中。对于2个池,在外部循环中使用parfor几乎总是更快(尝试并比较…。回答不错!如果使用
    parfor循环的切片变量对原始结构进行索引(在本例中为
    j
    ),它会工作。以任何其他方式编制索引似乎都不起作用。例如,
    s(1,:)
    不起作用,但
    s(j,:)
    起作用!