使用end来增长数组时出现意外行为

时间:2017-08-31 09:55:07

标签: arrays matlab

从图像目录构建视频数组时遇到意外行为。原始代码:

vid = [];
for i =startframe:endframe
    image = [directoryOfImages ,'\', images_names{1,i}];
    vid(:,:,:,end+1) = imread(image);
    waitbar((i-startframe) / (endframe-startframe));
end

然后我运行此代码来检查事情:

a = []; size(a)
a(end+1) = 1; size(a)

第一个尺寸为[0, 0],第二个尺码为[1, 1]。我在此代码中遇到的预期行为相同:

b = []; size(b)
b(:,end+1) = 1; size(b)

第一个尺寸为[0, 0],第二个尺码为[1, 1]。但在这段代码中,发生了一些奇怪的事情:

c = []; size(c)
c(:,:,end+1) = 1; size(c)

虽然此处第一个尺寸为[0,0],第二个尺寸为[1,1,2]。 这是非常意外的。我打印了c,我得到了这个:

>>c
c(:,:,1) =

     0

c(:,:,2) =

     1

最后,我运行了这个脚本:

c=[]; c(:,:,end)=1; size(c)

我得到[1, 1]

有人可以解释这里发生了什么吗?当我使用c=[]时,我得到一个大小为[0,0,1]的空数组吗?那么size(c)怎么没提到呢?以及为什么当我使用c(:,:,end)=1;时,其大小不是[1,1,1]?那我什么时候使用c(:,:,:,end)=1

1 个答案:

答案 0 :(得分:5)

这只是MATLAB选择要显示的内容。

在MATLAB中,矩阵是无限维的。作为一个很好的例子,让我们试试你的b

b = []; 
b(:,end+1) = 1; 

如您所知,您可以使用size查询特定维度的大小。例如。 size(b,2)返回1。但size(b,12345)返回什么?嗯,它也返回1,因为矩阵是无限维的。在12345维度中,b的大小为1

但是,显示功能会是多么可怕,如果每次键入size(b),它都会输出无限量的尺寸!因此,在显示时,MATLAB默认显示2个dims或N-dims,其中N是最远的维度,其上有数据(非单一维度)。

因此,您在c示例中看到的是显示函数的奇怪行为,而不是size函数。 size(c,3)返回1。这也是由[]仅将前两个维度的大小设置为零引起的,以避免在填充时MxPx0变量c(:,:,end)=imgend会发生什么它本质上是一个空变量。