2012-04-13 107 views
1

目前我有一個parfor循環在MATLAB中對結構進行計算。雖然我的代碼是有點長後,可以使用下面的例子來模擬:存儲結構變量在Parfor循環中計算 - MATLAB

a.test = [1 2 3]; 
result = []; 

parfor i = 1:3 
    c = a; 
    c.test(2) = round(rand()); 

    if c.test(2) == 1 
    %# Store c in result 
    end 
end 

disp(result.test) %# Should show [1 1 3] 

一個(因而c)是一個非常大的結構,所以存儲每次迭代是不適合我(因可行內存限制)。

理想情況下,我希望能夠將c直接存儲到我在parfor循環之前初始化的變量。看看MATLAB的Example: Using a Custom Reduction Function,我可以看到可以存儲給定的迭代變量(不必存儲每一次迭代),但我不完全理解它們的方法。我很困惑他們的函數如何產生2個獨立的輸出變量(看似),而函數只定義了一個輸出變量。

我相信這是一個非常普遍的問題,但到目前爲止,我的搜索沒有得到任何有效的結果。

任何幫助將不勝感激。

+0

我對你的意思是什麼在這裏有些困惑:你想要做的並行迭代,只有採取通過一些測試(可能取消其他任務)的第一個結果?如果你正在討論數組中的'cummax'函數,它只會執行一個輸出(恰好是一個2元素數組)。 – Dougal 2012-04-13 05:25:08

+0

關於'cummax'功能,我現在看到它。起初我沒有把A(1)和B(1)作爲手續,但我看到它現在在做什麼。儘管它不適用於我,但你仍在寫作。取消其他任務並不重要,取得結果更重要。不過,下面的Jonas展示了一個簡單的方法來做到這一點。 – rbhalla 2012-04-13 16:36:54

回答

2

你鏈接的例子並不完全是你想要的。但是,只能存儲「好」結果。這裏有一個簡單的例子:

A=zeros(0,2); %# initialize A with no rows, two columns 
parfor i=1:6 
    tmp = rand(1); %# create some result 
    if tmp > 0.5 %# store only part of the results 
     A = [A;[tmp,i]]; %# store also the iteration number, in case it matters 
    end 
end 
>> A 

A = 

    0.6497 2.0000 
    0.5052 4.0000 
    0.9993 5.0000 
+0

非常感謝!我有點尷尬,認爲我沒有弄清楚我的自我。根據我讀過的內容,我假設你應該在數組中的迭代槽中存儲特定的迭代結果。以這種形式連接結果從來沒有發生過。再次感謝你! – rbhalla 2012-04-13 16:39:43

+1

@rbOthree請注意,這實際上是一個parfor「縮減方法」,就像您鏈接的那個,只是一個內置的而非自定義的方法。 (在幕後,Matlab將收集結果並以某種任意方式連接它們,不一定按照迭代順序或它們完成的順序)。 – Dougal 2012-04-13 17:59:26