在子矩阵中压缩单维度的方式背后的规则是什么?
What is the rule behind the way singleton dimensions are squeezed in a submatrix?
在我看来,MATLAB 压缩了最后一个非单一维度右侧的单一维度,但矩阵必须至少是二维的限制。
从例子中推断规则让我感到不舒服,但它似乎有效。
二维:
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
将自动变为 1x2
,1x2x1x1x1x1x1x1x1x1
也会自动变为 1x2
,但 2x1
仍为 2x1
。当你索引时会发生这种情况,就像你的问题一样,而且当像 diff()
这样的函数会输出以单例维度结尾的东西时也会发生这种情况。
任何单一尺寸 而不是 是最后一个。因此 1x2x1x1x1x2
仍然是 1x2x1x1x1x2
,并且 1x2x1x1x1x2x1x1
也变成了 1x2x1x1x1x2
。您可以强制 squeeze()
强制退出所有单例维度;不过,你总是会留下至少一个二维矩阵(即使它只是一个 1x1
标量)。
作为旁注,正如 所说,
But then try this: E = zeros(2,3); size(E,3)!
Each array actually has an infinite number of singleton dimensions at the end!
所以从技术上讲,每个数组都有无限多维,最后一个都是空的,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
在我看来,MATLAB 压缩了最后一个非单一维度右侧的单一维度,但矩阵必须至少是二维的限制。
从例子中推断规则让我感到不舒服,但它似乎有效。
二维:
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
将自动变为 1x2
,1x2x1x1x1x1x1x1x1x1
也会自动变为 1x2
,但 2x1
仍为 2x1
。当你索引时会发生这种情况,就像你的问题一样,而且当像 diff()
这样的函数会输出以单例维度结尾的东西时也会发生这种情况。
任何单一尺寸 而不是 是最后一个。因此 1x2x1x1x1x2
仍然是 1x2x1x1x1x2
,并且 1x2x1x1x1x2x1x1
也变成了 1x2x1x1x1x2
。您可以强制 squeeze()
强制退出所有单例维度;不过,你总是会留下至少一个二维矩阵(即使它只是一个 1x1
标量)。
作为旁注,正如
But then try this:
E = zeros(2,3); size(E,3)!
Each array actually has an infinite number of singleton dimensions at the end!
所以从技术上讲,每个数组都有无限多维,最后一个都是空的,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