2015-05-06 37 views
0

我現在試圖在Matlab中進行並行計算,並希望使用parfor循環來提高效率。問題是我可以保證每個循環都是相互獨立的,但我最終需要更新一個全局變量(也許在Matlab中稱爲廣播變量),當我想給它賦值時有一個問題說它不能被分類。如果我仍然想在這個Matlab中做到這一點,我該如何解決這個問題,或者有什麼其他方式可以嘗試提高效率?使用parfor的廣播變量

的代碼是這樣的:

Atoms(1:nOfAtomsInTwoDim,:)=TwoDimAtoms; 
odd_type=TwoDimAtoms; 
even_type=TwoDimAtoms; 
even_type(:,1)=TwoDimAtoms(:,1)+LatticeSpacing/2; 
even_type(:,2)=TwoDimAtoms(:,2)+LatticeSpacing/2; 
parfor i=2:1:nOflayers+1 
    temp_type=TwoDimAtoms; 
    if mod(i,2) 
     temp_type=odd_type; 
     temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2; 
    else 
     temp_type=even_type; 
     temp_type(:,3)=TwoDimAtoms(:,3)+(i-1)*LatticeSpacing/2; 
    end 
    iBegin=(i-1)*nOfAtomsInTwoDim+1; 
    iEnd=i*nOfAtomsInTwoDim; 
    Atoms(iBegin,iEnd,:)=temp_type; 
end 
+0

最後一行有一個錯字,是這個問題嗎? '原子(iBegin,iEnd,:)'應該是'Atoms(iBegin:iEnd,:)'(第一個''應該是':') – PetrH

+0

哪一個是你的全局變量?沒有我們可以運行的代碼示例,很難理解你的問題。 – David

+0

PetrH你是對的,我其實並不是很熟悉Matlab ......但是我認爲它在我改變它之後仍然不起作用:( –

回答

1

你的代碼是不可執行的,這使得它有點棘手的工作發生了什麼事情,併爲@PetrH指出我認爲在年底你的索引表達式打算成爲Atoms(iBegin:iEnd,:)

要在parfor這項工作,你需要爲Atoms安排是sliced廣播變量輸入到parfor環路是恆定的,同爲每次迭代)。換句話說,你的索引表達式需要像

parfor i = ... 
    ... 
    Atoms(i, :) = ...; 
end 

更多的東西說了這麼多,如果這是你的整個parfor循環,我反而專注於向量化的東西,而不是應用parfor。看起來parfor循環內的工作量相當小,不太可能給您帶來太多好處,而我的猜測是矢量化應該會給您提供更好的加速。

+0

謝謝Edric 。我對Atoms(iBegin:iEnd,:)的錯誤,正如你所說的,如果Atoms是一個廣播變量,那麼我不允許在parfor中賦值給它嗎?如果我真的想把值賦給一個全局變量我該怎麼辦?你能解釋一下我可以用矢量加速嗎? –

+0

對不起*矢量化。 –