我在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
Error using parallel_function (line 589)
Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
s
是一个向量,而不是一个数组(因为它应该是,即使代码在完成之前中断)。编辑如果我将struct数组初始化为正确的大小,问题就解决了:
s=struct('a',cell(2,4),'b',cell(2,4));
但是,我仍然很乐意获得有关问题的见解(例如,如奥列格·科马罗夫所建议的那样,它会反弹一个错误)
答案 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
这里没有问题,但在其他情况下会变得复杂