我正在运行遗传算法,而我正在尝试并行化人口生成。 我的实际代码:
Q = [];
parfor i=1:halfPop
pa = P(select(f),:);
pb = P(select(f),:);
...
Q = [Q; pa; pb];
end
Matlab给出了错误 parfor中的临时变量Q未初始化。
所以我改写了这样:
Q = [];
parfor i=1:halfPop
pa = P(select(f),:);
pb = P(select(f),:);
Q(i,:) pa;
Q(i+halfPop,:) pb;
end
但现在我收到错误 parfor中的变量Q无法归类。。在编辑器中,MATLAB告诉我,我不能用两种不同的方式索引parfor中的相同矩阵。
我能做什么?
答案 0 :(得分:2)
parfor
尝试将Q
分割成与迭代一样多的切片,因此每次迭代都会得到一片Q
。在您的情况下,每次迭代都应该得到两个切片,parfor
无法处理(<)。
要解决此问题,您可以定义两个变量Qa
和Qb
,您可以在parfor
循环结束后将其合并。
[Qa,Qb] = deal(zeros(halfPop,size(P,2)));
parfor i=1:halfPop
pa = P(select(f),:);
pb = P(select(f),:);
Qa(i,:) = pa;
Qb(i,:) = pb;
end
Q = zeros(2*halfPop,size(P,2));
Q(1:2:end,:) = Qa;
Q(2:2:end,:) = Qb;
答案 1 :(得分:1)
如果您使用单个操作数进行串联,那么您尝试的“连接减少”应该可以正常工作
tmp = [pa; pb];
Q = [Q; tmp];
答案 2 :(得分:0)
许多不同的选项取决于pa和pb始终具有相同的大小。 Matlab希望确保没有数据“覆盖”的风险(因为没有更好的术语),并且在这种情况下无法确定。从本质上讲,每次迭代只能写一次矩阵,并且在它认为是“良好实践”的范围内完成。
我的解决方案:
Q = zeros(halfPop,size([pa pb]);
parfor i=1:halfPop
pa = P(select(f),:);
pb = P(select(f),:);
Q(i,:)= [pa pb];
end