Matlab 在子矩阵中压缩单态维度的方式背后的规则是什么?

Matlab 在子矩阵中压缩单态维度的方式背后的规则是什么?,matlab,matrix,submatrix,Matlab,Matrix,Submatrix,在我看来,MATLAB压缩了最后一个非单体维度右侧的单体维度,限制矩阵必须至少是二维的 从例子中推断出一条规则让我感到不舒服,但它似乎有效 在2D中: E = zeros(2,3); E(1,:); % 1x3 E(:,1); % 2x1 在3D中: E = zeros(2,3,4); E(1,:,:); % 1x3x4 E(:,1,:); % 2x1x4 E(:,:,1); % 2x3 E(1,1,:); % 1x1x4 E(:,1,1); % 2x1 E(1,:,1); % 1x3

在我看来,MATLAB压缩了最后一个非单体维度右侧的单体维度,限制矩阵必须至少是二维的

从例子中推断出一条规则让我感到不舒服,但它似乎有效

在2D中:

E = zeros(2,3);

E(1,:); % 1x3
E(:,1); % 2x1
在3D中:

E = zeros(2,3,4);

E(1,:,:); % 1x3x4
E(:,1,:); % 2x1x4
E(:,:,1); % 2x3

E(1,1,:); % 1x1x4
E(:,1,1); % 2x1
E(1,:,1); % 1x3
在4D中:

E = zeros(2,3,4,5);

E(:,:,:,1) % 2x3x4
E(:,:,1,1) % 2x3
E(:,1,1,1) % 2x1

E(1,:,:,:) % 1x3x4x5
E(1,1,:,:) % 1x1x4x5
E(1,1,1,:) % 1x1x1x5

E(:,:,1,:) % 2x3x1x5
E(:,1,:,:) % 2x1x4x5

E(1,:,:,1) % 1x3x4
E(1,:,1,:) % 1x3x1x5
E(:,1,:,1) % 2x1x4

E(1,1,:,1) % 1x1x4
E(1,:,1,1) % 1x3
有人能证实这是否是规定吗

附带问题:此规则是否也适用于函数,如
diff()
?似乎是这样

我看到的唯一区别是,你可以得到一个空矩阵,然后空维度左侧的单体维度不会被移除,即使它是最大维度:

E = zeros(2,3,4);

diff(E,1,1) % 1x3x4
diff(E,3,2) % 0x3x4

diff(E,2,2) % 2x1x4
diff(E,3,2) % 2x0x4

diff(E,3,3) % 2x3
diff(E,4,3) % 2x3x0
在4D中


再说一遍,这只是一个特别的解释,我不会测试每一个可能的情况。规则是什么?

任何高于第二个的尾随单例维度都会自动剥离。因此
1x2x1
将自动变为
1x2
1xx1x1x1x1x1x1
,但
2x1
仍保留
2x1
。这发生在索引时,就像在您的问题中一样,但也发生在像
diff()
这样的函数将输出以单例维度结尾的内容时

最后一个是任何单个维度而不是。因此,
1x2x1x1x1x2
保留为
1x2x1x1x2
,而
1x2x1x1x1x1x1x1x1x1x1x1x1
也变为
1x2x1x1x1x2
。您可以强制将所有单例维度强制输出;不过,您总是会得到至少一个2D矩阵(即使它只是一个
1x1
标量)


作为旁注,如前所述


然后试试这个:
E=0(2,3);尺寸(E,3)每个数组的末尾实际上有无限多个单体维度

因此,从技术上讲,每个数组都有无限多个维度,最后一个维度都是空的,默认情况下MATLAB不会显示它们,但它们是可索引的:

A=rand(3,3);
A(2,2,1)
ans=
0.4854
A(2,2,1,1)
ans=
0.4854
尺寸(A)
ans=
3     3
尺寸(A,4)
ans=
1.

任何高于第二个的尾随单体维度都会自动剥离。因此
1x2x1
将自动变为
1x2
1xx1x1x1x1x1x1
,但
2x1
仍保留
2x1
。这发生在索引时,就像在您的问题中一样,但也发生在像
diff()
这样的函数将输出以单例维度结尾的内容时

最后一个是任何单个维度而不是。因此,
1x2x1x1x1x2
保留为
1x2x1x1x2
,而
1x2x1x1x1x1x1x1x1x1x1x1x1
也变为
1x2x1x1x1x2
。您可以强制将所有单例维度强制输出;不过,您总是会得到至少一个2D矩阵(即使它只是一个
1x1
标量)


作为旁注,如前所述


然后试试这个:
E=0(2,3);尺寸(E,3)每个数组的末尾实际上有无限多个单体维度

因此,从技术上讲,每个数组都有无限多个维度,最后一个维度都是空的,默认情况下MATLAB不会显示它们,但它们是可索引的:

A=rand(3,3);
A(2,2,1)
ans=
0.4854
A(2,2,1,1)
ans=
0.4854
尺寸(A)
ans=
3     3
尺寸(A,4)
ans=
1.

但是试一下:
E=0(2,3);尺寸(E,3)
!实际上,每个数组的末尾都有无限多个单体维度!有趣的评论。这让我想到了浮点数小数部分的尾随零,不同之处在于保留了前导单例维度,而整数部分的前导零不重要;尺寸(E,3)
!实际上,每个数组的末尾都有无限多个单体维度!有趣的评论。这让我想到了浮点数小数部分的尾随零,不同的是,前导单例维度被保留,而整数部分的前导零不重要。
E = zeros(2,3,1,5);
diff(E,3,4) % 2x3x1x2
diff(E,4,4) % 2x3
diff(E,5,4) % 2x3x1x0