2013-05-02 91 views
2

我以前從未使用matlab,所以請原諒這個非常基本的問題。在Matlab中保存函數返回多個變量的返回值

基本上我已經返回多個變量的函數,定義如下所示:

function [a, b, c]=somefunction(x, y, z) 

我知道我能得到的返回值如下:

[a,b,c] = somefunction(1,2,3); 

現在我想做些什麼而是將somefunction的多次運行保存到數組中,然後再檢索它們。我想:

results = []; 
results = [results somefunction(1,2,3)]; 
results = [results somefunction(4,5,6)]; 

然後我試圖訪問各個運行爲:

% access second run, i.e. somefunction(1,2,3) ? 
a = results(2, 1); 
b = results(2, 2); 
c = results(2, 3); 

但是這告訴我,該指數是越界,因爲size(results) = [1,99654](99654是我需要的結果數保存)。所以它看起來不是一個數組?對不起,這個基本的問題,我再也沒有使用過matlab。

回答

2

當您將陣列與[ ... ]組合在一起時,您將它們連接在一起,從而創建一個長扁平數組。例如,如果調用1返回3個元素,調用2返回8個元素,調用3返回4個元素,那麼最終會得到一個14長的數組,並且無法知道哪些元素來自哪個函數調用。

如果您想要將每次運行的結果分開,可以將它們存儲在單元陣列中。你仍然需要一個逗號分隔的LHS列表來獲取所有的多個參數。與()相反,詮釋語法將內容「彈出」出入單元元素。

讓我們將結果存儲在一個名爲x的k乘n數組中,函數返回n個輸出,我們將其稱爲k次。

x = cell(2, 3); % cell(k, n) 
% Make calls 
[x{1,1}, x{1,2}, x{1,3}] = somefunction(1,2,3); 
[x{2,1}, x{2,2}, x{2,3}] = somefunction(4,5,6); 
% Now, the results of the ni-th argout of the ki-th call are in x{ki,ni} 
% E.g. here is the 3rd argout from the second call 
x{2,3} 

您還可以將argouts存儲在單獨的變量中,這些變量可能更具可讀性。在這種情況下,每個將是一個K-長的矢量

[a,b,c] = deal(cell(1,2)); % cell(1,k) 
[a{1}, b{1}, c{1}] = somefunction(1,2,3); 
[a{2}, b{2}, c{2}] = somefunction(1,2,3); 

當然,這種推廣到循環,如果你somefunction輸入是服從於和。

[a,b,c] = deal(cell(1,nIterations)); 
for k = 1:nIterations 
    [a{k}, b{k}, c{k}] = somefunction(1,2,3); 
end 

細節在DOCO在http://www.mathworks.com/help/matlab/cell-arrays.htmldoc cell

(旁註:在您的文章results(1, 2)應該尺寸爲[1,99654]數組成功當然你沒做results(2, 1)?)

+0

感謝!是的,結果(2,1)'不是另一個失敗了,現在已經確定了 – houbysoft 2013-05-02 04:49:57