MATLAB多维矩阵访问

时间:2013-01-01 05:04:42

标签: matlab matrix

新年快乐SO成员!

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

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

更令人困惑的结果是:

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

  • 不能使用相同的情节(X(51,51,:,i))

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

谢谢!

Edit01:

为方便起见,我会在这里用singleton和squeeze显示我的测试结果: sub matrix access

使用挤压:

squeezed

1 个答案:

答案 0 :(得分:3)

正如您所注意到的,当您使用100 by 100 by 100 by 3(51, :, 51, :)矩阵编入索引时,会返回大小为[1 100 1 3]的结果。 size = 1的维度称为 singleton 维度。

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

所以在你的情况下,你有

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)