Parfor与人口生成问题有关

时间:2013-02-09 11:34:36

标签: matlab parallel-processing genetic-algorithm

我正在运行遗传算法,而我正在尝试并行化人口生成。 我的实际代码:

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中的相同矩阵。

我能做什么?

3 个答案:

答案 0 :(得分:2)

parfor尝试将Q分割成与迭代一样多的切片,因此每次迭代都会得到一片Q。在您的情况下,每次迭代都应该得到两个切片,parfor无法处理(<)。

要解决此问题,您可以定义两个变量QaQb,您可以在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