首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于人口生成的Parfor问题

关于人口生成的Parfor问题
EN

Stack Overflow用户
提问于 2013-02-09 11:34:35
回答 3查看 250关注 0票数 2

我正在运行一种遗传算法,并试图并行化种群生成。我的实际代码:

代码语言:javascript
复制
Q = [];
parfor i=1:halfPop
    pa = P(select(f),:);
    pb = P(select(f),:);
    ...
    Q = [Q; pa; pb];
end 

Matlab给出了误差,parfor中的临时变量q未初始化.

所以我把它改写成这样:

代码语言:javascript
复制
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中的相同矩阵。

我能做什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-02-09 13:35:18

parfor试图将Q分割成尽可能多的迭代片,因此每次迭代都会得到Q的一个片段。在您的示例中,每次迭代都应该得到两个切片,parfor还无法处理这些切片。

要解决这个问题,您可以定义两个变量,QaQb,您可以在parfor循环结束后组合它们。

代码语言:javascript
复制
[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;
票数 2
EN

Stack Overflow用户

发布于 2013-02-09 20:23:55

如果您使用像这样的单个操作数进行连接,那么您正在尝试的“级联还原”应该可以工作。

代码语言:javascript
复制
tmp = [pa; pb];
Q = [Q; tmp];
票数 1
EN

Stack Overflow用户

发布于 2013-02-09 13:33:57

许多不同的选择取决于pa和pb的大小一致。Matlab希望确保没有数据“覆盖”的风险(因为缺少更好的术语),而且在这种情况下它无法确定这一点。本质上,您只能在每次迭代中写入矩阵一次,并且可以在它认为的“良好实践”的范围内完成。

我的解决方案:

代码语言:javascript
复制
Q = zeros(halfPop,size([pa pb]);
parfor i=1:halfPop
    pa = P(select(f),:);
    pb = P(select(f),:);
    Q(i,:)= [pa pb];
end 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14787677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档