3

SO会员们新年快乐!

新年的第一篇文章,希望能有所收获!:D

我有一个大小为 100、100、100、3 的 4D 矩阵 X。我用 X(51,:,51,:) 提取它的子矩阵,并期望结果是一个 100x3 2D 矩阵。但是不,结果是一个大小为 1、100、1、3 的 4D 矩阵。怎么会?

更令人困惑的结果是:

  • 我可以使用 plot(X(51,:,51,i)) 和 plot(X(:,51,51,i)) 与 i=1, 2, 3 就好了

  • 不能将 plot(X(51,51,:,i)) 与相同的 i 一起使用

简而言之,MATLAB 子矩阵提取不会导致矩阵尺寸减小吗?并且不同的子访问行为不同,即对最后一个维度更小心?

谢谢!

编辑01:

为方便起见,我将使用单例显示我的测试结果并在此处挤压: 子矩阵访问

挤压的使用:

挤压

4

1 回答 1

3

正如您所注意到的,当您对100 by 100 by 100 by 3矩阵进行索引时,(51, :, 51, :)您会得到 size 的结果[1 100 1 3]。的尺寸size = 1称为单件尺寸。

MATLAB 不会自动删除非尾随单例维度(对于大于 2D 的矩阵) - 使用挤压来消除这些维度。如果最后一个维度是单例,则会自动处理。

所以在你的情况下,你有

X = zeros(100,100,100,3);
Y = X(51,:,51,:); #% size(Y) = [1 100 1 3];
Y2 = squeeze(X(51,:,51,:)); #% size(Y2) = [100 3] - singletons removed

P1 = X(51,:,51,1); #% size(P1) = [1 100 1 1] which becomes [1 100] (2D)
P2 = X(51,51,:,1); #% size(P2) = [1 1 100 1] which becomes [1 1 100] (3D)
于 2013-01-01T05:17:06.330 回答