【发布时间】: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,有arrayfun和cellfun,但正如您所见,它们很慢,因为映射是在 Matlab 中完成的,而不是在 Java 内部。底线:在 Matlab 中,最好考虑向量化函数 -
按照 Adriaan 的建议,发布您需要执行的实际计算,我们或许可以帮助您对其进行矢量化处理。