2014-01-15 77 views
3

下面的代碼,我有作爲例子:初始化一個三維矩陣,並添加新的數據

aaa = []; 
bbb = []; 
for ii = 1:10 
    [aaa(:,:,end+1), bbb(:,end+1)] = myfunction(); 
end 

功能myfunction

function [aaa, bbb] = myfunction() 
    aaa = rand(5,3); 
    bbb = rand(5,1); 
end 

我知道我可以使用ii從發送輸出變量爲aaabbb,如[aaa(:,:,ii), bbb(:,ii)] = myfunction()。我只是想知道爲什麼爲aaa我生成一個5x3x11矩陣(不應該是5x3x10?)?。對於bbb,它正確地生成一個5x10矩陣。因此,爲什麼end + 1適用於bbb而不適用於aaa

回答

0

我找到了解決我的問題的方法。爲了對第三維end+1工作,aaa應該聲明如下:

aaa = zeros(0,0,0); 

對於爲什麼這個作品作進一步的解釋見this link

3

我相信這與MATLAB如何定義一個空矩陣有關。如果你使用size(aaa),MATLAB會返回0 0,就像你期望的那樣。 size(bbb)返回相同。但是,如果您明確嘗試使用size(aaa,3)來查找第三維的大小,則MATLAB返回1。所以看起來,MATLAB將空矩陣定義爲在前兩維中具有零尺寸,並且在所有其他維中具有1的尺寸。

這意味着,當你做a(:,:,end+1),你實際上訪問a(:,:,2),因爲a第三維的到底是1,即使它是空的。您沒有b這個問題,因爲它只是二維的,而空矩陣的第二維的結尾是零。

編輯:順便說一句,如果你打算在循環中給它們賦值,你應該總是預先分配你的矩陣(我相信MATLAB會抱怨這個)。如果不這樣做,矩陣必須在每次循環迭代時重新調整大小,通常會導致執行時間變慢。

+0

非常有趣。 MATLAB有一些空矩陣不直觀的怪癖。 – chappjc

+0

因此,解決方案將是第一個案件的條件? –