【问题标题】:How to fold dimension of a tensor into a scalar in MATLAB如何在MATLAB中将张量的维度折叠成标量
【发布时间】:2018-09-28 15:58:46
【问题描述】:

我在 MATLAB 中有一个 n×m×l 张量,我想通过折叠最后一维(特别是添加每个标量)将其变成一个 n×m 矩阵.如何有效地执行此张量中每个条目的最后一个维度的折叠/减少? 更广泛地说,有没有一种很好的方法可以将任意函数应用于张量的整个维度?

如果有助于理解,我的具体张量称为pixels,最后一个维度是l=3,表示每个像素的R、G和B值,我想添加这些值以获得亮度。我提出的以下解决方案非常缓慢:

cellfun( @(x) sum(x), num2cell( pixels, 3 ) )

【问题讨论】:

  • Matlab 并不容易以这种方式工作。没有 fold 高阶函数。相反,有 vectorized 函数可以为特定的二进制操作进行折叠:sum 用于折叠 +prod 用于折叠 * 等。这是为了提高速度:折叠是在内部完成(可能在 Java 中)。再举一个例子,对于其他语言中的高阶函数 map,有 arrayfuncellfun,但正如您所见,它们很慢,因为映射是在 Matlab 中完成的,而不是在 Java 内部。底线:在 Matlab 中,最好考虑向量化函数
  • 按照 Adriaan 的建议,发布您需要执行的实际计算,我们或许可以帮助您对其进行矢量化处理。

标签: matlab matrix fold tensor


【解决方案1】:
sum(pixels,3)

sum 允许对给定的任何维度求和,所以只需给它第三个维度。尾随维度会被自动截断,因此您的矩阵最终大小为 n×m。

否则,对于一般功能:使用循环。循环不再很慢,而细胞肯定是:

out = zeros(size(pixels,1),size(pixels,2));
for ii = 1:size(pixels,3)
    out(:,:) = YourFunc(pixels(:,:,ii));
end

【讨论】:

  • 谢谢。如果我想执行不同类型的折叠怎么办?还是对整个维度应用任意函数?
  • 我不知道你所说的“折叠”是什么意思,但是有几个函数(min,max,mean,sum,cumsum 等)有这个维度参数,否则:使用循环。 MATLAB 中的循环不再很慢,而且通过单元格的速度肯定会慢很多。
  • 我希望有一种比使用循环更优雅的方法,而且我的函数实际上比求和要复杂一些(我为这个问题简化了它)。无论如何感谢您的回答。如果有兴趣,请参阅此处了解折叠的定义:en.wikipedia.org/wiki/Fold_%28higher-order_function%29
  • @anroesti 在这种情况下,您的示例在minimal reproducible example 部门中太minimal了。询问您想要的东西,而不是过于简单化的情况以获得正确的答案。循环是否“优雅”是一个品味问题,在我看来,它比复杂的 cellfun 方式更优雅。
  • 更优雅更快!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-25
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多