当我在parfor
循环中使用结构数组时遇到了一个奇怪的问题。以下是我的主要功能:
comm_struct=struct('field1',0,'field2',zeros(10,1),'field3',sparse(zeros(10,10)));
a(1:100,1)=comm_struct;
b(1:10,1)=comm_struct;
disp(size(b))
parfor ct=1:12
b=max_select_2(b,a);
end
其中max_select_2
是
function y=max_select_2(b,a)
if size(b,1)~=10
error('size of b is not 10 but %d',size(b,1)),
end
d(1:110,1)=struct('field1',0,'field2',zeros(10,1),'field3',sparse(zeros(10,10)));
d(1:10,1)=b;
d(11:110,1)=a;
[~,sort_idx]=sort([d.field1],'descend');
y=d(sort_idx(1:10));
如果我用| for |替换parfor
并在我的本地matlab上运行,没问题,但是如果我使用parfor
并在集群上运行它,那么输出就是
10 1
这是预期的但我也收到了错误消息
"size of b is not 10 but 100"
这意味着由于某些原因b
传递给函数max_select_2
时,其大小从10变为100?我怀疑它与matlab如何处理结构数组有关,但我不知道发生了什么以及如何解决它...
任何帮助表示赞赏!谢谢!
立
答案 0 :(得分:0)
不允许使用您正在使用的累积功能(reference)
除非f是已知的非交换内置函数,否则它被认为是可交换的。目前无法在parfor中指定用户定义的非交换函数。
根据我对您的代码的理解,我建议使用;
(连接)在parfor循环外积累和排序。另一个替代方案是切片矩阵,其中每个迭代允许填充10列元素中的一列,最后将其排序并重新整形为循环外的向量。