2013-05-21 86 views
5

我在Matlab的parfor循環中使用struct數組時遇到了問題。下面的代碼具有2個問題我不理解:在parfor中使用struct arrays

s=struct('a',{},'b',{}); 
if matlabpool('size')==0 
    matlabpool open local 2 
end 

for j = 1:2  
    parfor k=1:4 
    fprintf('[%d,%d]\n',k,j) 
    s(j,k).a = k; 
    s(j,k).b = j; 
    end 
end 
matlabpool close 
  1. 它失敗並顯示錯誤Error using parallel_function (line 589) Insufficient number of outputs from right hand side of equal sign to satisfy assignment.
  2. 在輸出時,可變s是一個向量,而不是一個陣列(因爲它應該是,即使代碼在完成之前休息)。如果我初始化結構數組正確的尺寸,

編輯問題解決了:

s=struct('a',cell(2,4),'b',cell(2,4)); 

不過,我還是很樂意得到有關該問題的見解(例如是按照Oleg Komarov的建議召集一個bug)

+0

對於第2點很複雜,你是什麼意思「陣列」,而不是「載體」?在Matlab中沒有區別。它看起來像's'應該是這個代碼末尾的'struct'的2x4矩陣。 – jazzbassrob

+0

我認爲這實際上是一個錯誤,我建議提交一個[support equest](http://www.mathworks.it/support/service_requests/contact_support.do?)並且讓我們更新。 – Oleg

+0

@jazzbassrob,一個向量是一個1xd數組(或dx1)。 –

回答

3

它最初對我來說工作正常,但後來我不知道會發生什麼。一般來說,您需要小心使用parfor循環,並且有足夠的文檔說明如何對齊所有內容。兩個不同的忠告。 第一,更重要的是,PARFOR循環是在外面的循環:

function s = foo 
s=struct('a',{},'b',{}); 

parfor j = 1:2  
    for k=1:4 
    fprintf('[%d,%d]\n',k,j) 
    s(j,k).a = k; 
    s(j,k).b = j; 
    end 
end 

二,MATLAB獲取有關寫作的主要出入口變量非常挑剔(即包含在PARFOR環路被索引到循環變量,在你的情況下,s)。你首先需要創建一個虛擬變量來保存所有的內部循環信息,然後在循環結尾寫入一次。例如:

function s = khal 
s=struct('a',{},'b',{}); 


parfor j = 1:2 
    dummy=struct('a',{},'b',{}); 
    for k=1:4 
    fprintf('[%d,%d]\n',k,j) 
    dummy(k).a = k; 
    dummy(k).b = j; 
    end 
    s(j,:) = dummy; 
end 

你沒有問題就在這裏,但它可以在其他情況下

+0

parfor爲什麼要在外環中?如果我在索引[1,2]上有外循環,在索引[1,...,1000]上有內循環,那麼較長的內循環將不會並行化,是嗎? –

+0

有一個開銷花費有parfor循環,有些情況下將是成本效益在內部循環(特別是如果你有兩個以上的池運行),但一般來說,你應該構造代碼parfor循環在外循環中。在2的池中,在外環中使用parfor時,它幾乎總是會更快(嘗試和比較...)。 – Rasman

+0

很好的答案!不知何故,如果你用'parfor loop'的切片變量(在本例中爲'j')索引原始結構,它就可以工作。以任何其他方式進行索引似乎都不起作用。例如,s(1,:)'不起作用,但是(j,:)'做! –