初始化3D矩阵并添加新数据

时间:2014-01-15 20:02:48

标签: matlab matrix

这里是我的代码:

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

2 个答案:

答案 0 :(得分:3)

我认为这与MATLAB如何定义空矩阵有关。如果你size(aaa),MATLAB将返回0 0,如你所料。 size(bbb)返回相同的内容。但是,如果您明确尝试使用size(aaa,3)查找第3维的大小,则MATLAB将返回1。因此,似乎MATLAB将空矩阵定义为在前两个维度中具有零大小,并且在所有其他维度中大小为1.

这意味着当您执行a(:,:,end+1)时,您实际上正在访问a(:,:,2),因为a的第三维度的结尾是1,即使它是空的。 b没有这个问题,因为它只是二维的,而空矩阵的第二维的末尾是零。

编辑:顺便说一句,如果你要在一个循环中为它们赋值,你应该总是预先分配你的矩阵(我相信MATLAB会抱怨这个)。如果不这样做,则必须在每次循环迭代时调整矩阵的大小,通常会导致执行时间变慢。

答案 1 :(得分:0)

我找到了解决问题的方法。为了使end+1适用于第三维,aaa应声明如下:

aaa = zeros(0,0,0);

有关其工作原理的进一步说明,请参阅this link