我正在运行一种遗传算法,并试图并行化种群生成。我的实际代码:
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中的相同矩阵。
我能做什么?
发布于 2013-02-09 13:35:18
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;发布于 2013-02-09 20:23:55
如果您使用像这样的单个操作数进行连接,那么您正在尝试的“级联还原”应该可以工作。
tmp = [pa; pb];
Q = [Q; tmp];发布于 2013-02-09 13:33:57
许多不同的选择取决于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 https://stackoverflow.com/questions/14787677
复制相似问题