在 Matlab / Octave 中是否有自动挤压的机制
Is there any mechanism to auto squeeze in Matlab / Octave
对于 nD 数组,如果能够自动挤压以移除单维度,那就太好了。有没有办法做到这一点,我不知道?这对于聚合函数(例如求和、均值等)特别有用,因为您总是希望结果的维度更少。
这是一个简单的例子:
>> A = ones(3,3,3);
>> B = mean(A);
>> size(B)
ans =
1 3 3
>> squeeze(B)
ans =
1 1 1
1 1 1
1 1 1
要是Matlab/Octave能自动帮我做挤压就好了。或者,如果有一种方法可以打开该选项(类似于 hold on
绘图)。
据我所知,Matlab 没有。而且我认为这不是一个好主意。考虑您示例的修改版本:
>> A = ones(3,1,1,3);
>> B = mean(A);
>> size(B)
ans =
1 1 1 3
这里“自动挤压”应该做什么?将 B
缩小到 [1 1 3]
或 [1 3]
?
您可能会争辩说它应该删除 相同的 维度,mean
已经变成了单例。但随后必须在 mean
函数中完成,也许需要一个可选的输入参数。获得函数输出后,没有任何信息如何获得它。
或者您可以争辩说它应该删除 all 单例维度,就像 squeeze
(或多或少)那样。但随后它会删除函数 input 中已经是单例的维度,这可能是不需要的。
如果你问我,在 squeeze
中输入 second 指定要删除的(单例)维度将是一个很好的补充(与你相同可以使用 mean(A, 1)
强制沿第一个维度应用操作,即使 A
恰好是行向量)。
我同意 Luis 和 Cris 的观点,但我要补充以下内容。
Matlab 和 Octave do 都会自动挤压额外的维度,在一个非常特殊的场景中:任何维度 最后 已经减少给单例,自动排掉。
例如
A = ones([1,2,3,4]);
B = mean(A, 4);
size(B)
% ans = 1 2 3
请注意,答案是 [1,2,3]
,而 不是 [1,2,3,1]
。这与 python 等语言形成对比,例如,(1,1) 的大小与 (1,)
.
的大小有很大不同
因此,对于您的问题,利用这一优势的一种方法是确保始终在最后找到要减少的维度,从而自动简化。
当您意识到以下内容时,这会变得更加有用:
size(A(:)) % ans = 24 1 (i.e. 24)
size(A(:,:)) % ans = 1 24
size(A(:,:,:)) % ans = 1 2 12
size(A(:,:,:,:)) % ans = 1 2 3 4
意思是,如果您按层次对维度进行排序,则可以确保需要在更高维度上进行的任何操作都可以 a) 轻松矢量化,以及 b) 给出自然结果,而无需浪费时间压缩或置换结果维度。
对于 nD 数组,如果能够自动挤压以移除单维度,那就太好了。有没有办法做到这一点,我不知道?这对于聚合函数(例如求和、均值等)特别有用,因为您总是希望结果的维度更少。
这是一个简单的例子:
>> A = ones(3,3,3);
>> B = mean(A);
>> size(B)
ans =
1 3 3
>> squeeze(B)
ans =
1 1 1
1 1 1
1 1 1
要是Matlab/Octave能自动帮我做挤压就好了。或者,如果有一种方法可以打开该选项(类似于 hold on
绘图)。
据我所知,Matlab 没有。而且我认为这不是一个好主意。考虑您示例的修改版本:
>> A = ones(3,1,1,3);
>> B = mean(A);
>> size(B)
ans =
1 1 1 3
这里“自动挤压”应该做什么?将 B
缩小到 [1 1 3]
或 [1 3]
?
您可能会争辩说它应该删除 相同的 维度,
mean
已经变成了单例。但随后必须在mean
函数中完成,也许需要一个可选的输入参数。获得函数输出后,没有任何信息如何获得它。或者您可以争辩说它应该删除 all 单例维度,就像
squeeze
(或多或少)那样。但随后它会删除函数 input 中已经是单例的维度,这可能是不需要的。
如果你问我,在 squeeze
中输入 second 指定要删除的(单例)维度将是一个很好的补充(与你相同可以使用 mean(A, 1)
强制沿第一个维度应用操作,即使 A
恰好是行向量)。
我同意 Luis 和 Cris 的观点,但我要补充以下内容。
Matlab 和 Octave do 都会自动挤压额外的维度,在一个非常特殊的场景中:任何维度 最后 已经减少给单例,自动排掉。
例如
A = ones([1,2,3,4]);
B = mean(A, 4);
size(B)
% ans = 1 2 3
请注意,答案是 [1,2,3]
,而 不是 [1,2,3,1]
。这与 python 等语言形成对比,例如,(1,1) 的大小与 (1,)
.
因此,对于您的问题,利用这一优势的一种方法是确保始终在最后找到要减少的维度,从而自动简化。
当您意识到以下内容时,这会变得更加有用:
size(A(:)) % ans = 24 1 (i.e. 24)
size(A(:,:)) % ans = 1 24
size(A(:,:,:)) % ans = 1 2 12
size(A(:,:,:,:)) % ans = 1 2 3 4
意思是,如果您按层次对维度进行排序,则可以确保需要在更高维度上进行的任何操作都可以 a) 轻松矢量化,以及 b) 给出自然结果,而无需浪费时间压缩或置换结果维度。