2013-02-09 4 views
2

유전 알고리즘을 실행 중이며 인구 생성을 병렬 처리하려고합니다. 내 실제 코드 :인구 생성에 관한 Parfor 문제

Q = []; 
parfor i=1:halfPop 
    pa = P(select(f),:); 
    pb = P(select(f),:); 
    ... 
    Q = [Q; pa; pb]; 
end 

매트랩 나에게 오류 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 내부의 같은 행렬에 두 가지 다른 방법으로 인덱스 할 수 없다고 말합니다.

어떻게해야합니까?

+0

같은 단일 피연산자로 연결을 할 경우이 있나요 왜'parfor' 루프 내에서 작동합니다 시도하고있는 "연결 감소"? '선택'은 많은 시간을 필요로하는 함수인가? 그렇지 않다면'for'-loop가 실제로 빠를 수도 있습니다. – Jonas

+0

글쎄, 나는 질문을하기위한 코드를 단순화했다. 실제로 두 가지 다른 시간 소모적 인 일이있다. – Enoon

답변

2

parfor 시도가 많은 조각으로 Q를 분할. 귀하의 경우, 각 반복에는 두 조각이 있어야하는데, parfor은 (아직) 처리 할 수 ​​없습니다.

이 문제를 해결하려면 루프의 끝에서 결합 할 수있는 QaQb의 두 변수를 정의 할 수 있습니다.

[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; 
+0

고마워, 이건 내가 부지런하게 나온 해결책이다. 가장 빠르지는 않지만 작동합니다. – Enoon

0

wha pa와 pb에 따라 많은 옵션이 일관되게 동일합니다. Matlab은 데이터가 "덮어 쓰기"(더 나은 용어가 없음) 위험이 없음을 확인하기를 원하며,이 경우이를 확인할 수 없습니다. 본질적으로 반복마다 한 번만 매트릭스에 쓸 수 있으며 "우수 사례"라고 생각하는 범위 내에서 완료됩니다.

내 솔루션 :이 반복되어, 각각의 반복이 Q 한 조각을수록

Q = zeros(halfPop,size([pa pb]); 
parfor i=1:halfPop 
    pa = P(select(f),:); 
    pb = P(select(f),:); 
    Q(i,:)= [pa pb]; 
end 
+0

이 코드는 pa와 pb를 같은 줄에 삽입하지 않겠는가? – Enoon

+0

@ 확실히 알지만 다른 모든 것을 알면 Q를 마음의 내용으로 재구성 할 수 있습니다. 귀하의 질문은 Q를 두 가지 방식으로 구성하기 때문에 Q를 어떻게 설정하고 싶은지 잘 모르겠습니다. – Rasman

+0

설명해 주셔서 감사합니다. – Enoon

1

당신은 당신이 그렇게

tmp = [pa; pb]; 
Q = [Q; tmp];