2

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

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 内的同一个矩阵。

我能做什么?

4

3 回答 3

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;
于 2013-02-09T13:35:18.260 回答
1

如果您像这样使用单个操作数进行连接,那么您尝试的“连接减少”应该可以工作

tmp = [pa; pb];
Q = [Q; tmp];
于 2013-02-09T20:23:55.117 回答
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 
于 2013-02-09T13:33:57.087 回答