【问题标题】:Is there any mechanism to auto squeeze in Matlab / Octave是否有任何机制可以在 Matlab / Octave 中自动挤压
【发布时间】:2021-03-20 03:12:24
【问题描述】:

对于 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 的情节)。

【问题讨论】:

  • 你是指矩阵的显示,还是矩阵本身?如果维度任意从矩阵中消失,我会觉得很可怕,这将使编写算法逻辑变得非常困难。
  • 另外,a=[1,2,3] 应该返回一个列向量吗?和a=[1;2;3]做同样的事情?
  • @CrisLuengo 您的第二个问题已经得到解答,我认为,需要与squeeze 的行为兼容:行向量被挤入列中跨度>
  • 问题是,单一维度被广泛用于代码的矢量化。如果您找到一个解决方案,可以让 matlab 始终自动执行此操作,它也会为自己的代码执行此操作,这通常依赖于现有的那些单例(例如,用于广播)。您可能会破坏许多 MATLAB 内置功能。
  • 当我有足够的内存时,我会使用大量的 n 维投影和广播来加速代码。自动挤压会打破这一切。

标签: arrays matlab multidimensional-array octave


【解决方案1】:

据我所知,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 恰好是行向量,也要沿第一个维度应用的操作)。

【讨论】:

  • 同意。您可以使用permute 删除特定的单一维度。
  • 对我来说,我更愿意删除所有单例维度。我什至不确定我是否喜欢前两个维度的单例。但我离题了。最容易实现 是删除all 单一维度。但是有些用户可能更喜欢一种行为,即只删除刚刚达到 1 的维度。语法可以是 auto reduce on allauto reduce on 来分别处理这两种情况。
【解决方案2】:

我同意 Luis 和 Cris 的观点,但我会补充以下内容。

Matlab 和 Octave do 都会自动挤压额外的维度,在一个非常特殊的场景中:在末尾​​em> 已被简化为单例的任何维度都会被自动挤压出来。

例如

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) 给出自然的结果,而无需浪费时间挤压或排列结果维度。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多