MATLAB多维矩阵访问

3

SO成员们,新年快乐!

这是我在新的一年里发布的第一篇帖子,希望能够得到一些好运! :D

我有一个4D矩阵X,大小为100、100、100、3。我用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:

为了方便起见,我在此展示了我的单例和挤压测试结果: sub matrix access

使用squeeze:

squeezed

1个回答

3

正如您注意到的那样,当您使用(51, :, 51, :)索引您的100 by 100 by 100 by 3矩阵时,您会得到一个大小为[1 100 1 3]的结果。其中size = 1的维度被称为单例维度。

对于大于2D的矩阵,MATLAB不会自动删除非尾随单例维度 - 使用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)

感谢新年的好运!我现在可以记录这个MATLAB的备注了。 - TSL_
顺便说一下,我想添加一个小修正:P2 = X(51,51,:,1); % size(P2) = [1 1 100],并在被压缩后变为[101 1]。 - TSL_

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接