在子矩阵中挤压单例维度背后的规则是什么?



在我看来,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 中

E = zeros(2,3,1,5);
diff(E,3,4) % 2x3x1x2
diff(E,4,4) % 2x3
diff(E,5,4) % 2x3x1x0

再说一次,这只是一个临时的解释,我不打算测试每一个可能的情况。规则是什么?

任何高于秒的尾随单例维度都会自动剥离。所以1x2x1会自动成为1x21x2x1x1x1x1x1x1x1x1也会,但2x1仍然是2x1。当您索引时(例如在您的问题中)以及像diff()这样的函数将输出以单例维度结尾的内容时,也会发生这种情况。

任何不是最后一个的单例维度都将保留下来。因此1x2x1x1x1x2保持1x2x1x1x1x21x2x1x1x1x2x1x1也变得1x2x1x1x1x2。您可以强制squeeze()强制所有单例维度;不过,您将始终至少留下一个 2D 矩阵(即使它只是一个1x1

标量)。

作为旁注,正如克里斯·卢内戈所说,

但是,请尝试以下操作:E = zeros(2,3); size(E,3)!每个数组实际上在末尾都有无限数量的单例维度!

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

A = rand(3,3);
A(2,2,1)
ans =
0.4854
A(2,2,1,1)
ans =
0.4854
size(A)
ans =
3     3
size(A,4)
ans =
1

最新更新