2014-01-15 55 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

因此,解决方案将是第一个案件的条件? –