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)
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));
Run Code Online (Sandbox Code Playgroud)
但是,我仍然很乐意得到关于这个问题的见解(例如,它是一个bug,如Oleg Komarov所建议的那样)
它最初对我来说工作正常,但后来我不知道会发生什么。一般来说,您需要小心使用 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)
这里没有问题,但在其他情况下可能会变得复杂