Matlab 在parfor中使用结构数组
我在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
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
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,:)
起作用!