从图像目录构建视频数组时遇到意外行为.原始代码:
vid = [];
for i =startframe:endframe
image = [directoryOfImages ,'\', images_names{1,i}];
vid(:,:,:,end+1) = imread(image);
waitbar((i-startframe) / (endframe-startframe));
end
Run Code Online (Sandbox Code Playgroud)
然后我运行此代码来检查事物:
a = []; size(a)
a(end+1) = 1; size(a)
Run Code Online (Sandbox Code Playgroud)
第一个尺寸是[0, 0],第二个尺寸是[1, 1].我在这段代码中得到的预期行为相同:
b = []; size(b)
b(:,end+1) = 1; size(b)
Run Code Online (Sandbox Code Playgroud)
第一个尺寸是[0, 0],第二个尺寸是[1, 1].但在这段代码中,发生了一些奇怪的事情:
c = []; size(c)
c(:,:,end+1) = 1; size(c)
Run Code Online (Sandbox Code Playgroud)
而这里的第一个尺寸是[0,0],第二个是[1,1,2].这是非常意外的.我打印了c,我得到了这个:
>>c
c(:,:,1) =
0
c(:,:,2) =
1
Run Code Online (Sandbox Code Playgroud)
最后,我运行了这个脚本:
c=[]; c(:,:,end)=1; size(c)
Run Code Online (Sandbox Code Playgroud)
和我[1, 1].
谁能解释一下这里发生了什么?当我使用时c=[],我得到一个大小为空的数组[0,0,1]?那怎么来size(c)不提呢?为什么当我使用c(:,:,end)=1;它的尺寸不是[1,1,1]?我什么时候使用c(:,:,:,end)=1?
这只是MATLAB选择要显示的内容.
在MATLAB中,矩阵是无限维的.作为一个很好的例子,让我们试试你的b:
b = [];
b(:,end+1) = 1;
Run Code Online (Sandbox Code Playgroud)
如您所知,您可以使用查询特定维度的大小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)=img情况是什么end?),这本质上是一个空变量.