新年快乐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显示我的测试结果:
使用挤压:
答案 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)