Matlab 初始化三维矩阵并添加新数据
下面是我的代码示例:Matlab 初始化三维矩阵并添加新数据,matlab,matrix,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将变量的输出发送到aaa和bbb如[aaa(:,:,ii),bbb(:,ii)]=my
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
将变量的输出发送到aaa
和bbb
如[aaa(:,:,ii),bbb(:,ii)]=myfunction()
。我只是想知道为什么aaa
会生成一个5x3x11矩阵(不应该是5x3x10?)?。对于bbb
,它正确地生成5x10矩阵。因此,为什么end+1
适用于bbb
而不是aaa
?我认为这与MATLAB如何定义空矩阵有关。如果执行size(aaa)
,MATLAB将返回0
,正如您所期望的那样<代码>大小(bbb)返回相同的值。但是,如果您明确尝试使用size(aaa,3)
查找第三维的大小,MATLAB将返回1
。因此,似乎MATLAB将空矩阵定义为在前两个维度中大小为零,在所有其他维度中大小为1
这意味着当你做a(:,:,end+1)
时,你实际上是在访问a(:,:,2)
,因为a
的第三维的末尾是1,即使它是空的。对于b
,您没有这个问题,因为它只是二维的,而空矩阵的第二个维度的末尾是零
编辑:顺便说一句,如果要在循环中为矩阵赋值,您应该始终预先分配矩阵(我相信MATLAB会对此抱怨)。否则,每次循环迭代都必须调整矩阵的大小,这通常会导致执行时间变慢。我找到了解决问题的方法。为了使
end+1
适用于第三维,aaa
应声明如下:
aaa = zeros(0,0,0);
请参阅,以进一步了解此操作的原因。非常有趣。MATLAB对于空矩阵有一些不直观的怪癖。所以解决方案是对第一种情况有一个条件?