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 内の同じ行列を 2 つの異なる方法でインデックス付けできないことを教えてくれます。

どうすればいいですか?

4

3 に答える 3

2

parfor反復と同じ数のスライスに分割しようとするQため、各反復はのスライスを1つ取得しますQ。あなたの場合、各反復は2つのスライスを取得する必要がありますが、これparforは(まだ)処理できません。

これを修正するには、ループの終了後に組み合わせることができる2つの変数Qaとを定義できます。Qbparfor

[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は、データが「上書き」されるリスクがないことを確認したいと考えています(より適切な用語がないため)。この場合、それを確認することはできません。基本的に、マトリックスへの書き込みは反復ごとに1回のみであり、「グッドプラクティス」であると信じられている範囲内で実行されています。

私の解決策:

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 に答える