Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 初始化三维矩阵并添加新数据_Matlab_Matrix - Fatal编程技术网

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对于空矩阵有一些不直观的怪癖。所以解决方案是对第一种情况有一个条件?