2013-01-01 192 views
3

新年快乐SO会员!MATLAB多维矩阵访问

我的第一个帖子为新的一年,希望能得到一些运气! :D

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

甚至更​​混乱的结果是:

  • 我可以使用曲线图(X(51,:,51,i))和曲线图(X(:,51,51,i))的,其中i = 1,2,3就好

  • 不能使用图(X(51,51,:,i))的具有相同I

总之

,MATLAB子矩阵提取不会导致尺寸缩小矩阵?而不同的子访问行为有所不同,即对最后维度更加谨慎?

谢谢!

Edit01:

为了方便起见,我会展示我的单身测试结果,并挤在这里: sub matrix access

使用挤压:

squeezed

回答

3

正如你已经注意到了当你用(51, :, 51, :)索引到100 by 100 by 100 by 3矩阵时,你会得到一个尺寸为[1 100 1 3]的结果。尺寸为size = 1的尺寸被称为单件尺寸。

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) 
+0

感谢您在新的一年好运!顺便说一下,我现在可以将这个MATLAB备注文件 –

+0

存档,我想添加一个小的更正:P2 = X(51,51,:,1); %大小(P2)= [1 1 100]以及被排队[101 1]之后。 –