【问题标题】:Fastest way to "transpose-conjugate"“转置共轭”的最快方法
【发布时间】:2015-12-17 08:48:22
【问题描述】:

给定矩阵 A 和 P,我需要计算“转置共轭”(不确定术语是什么)

X = P A Transpose(P)

我在想最快的方法是

for(int i=0;i<n;i++) {
      for(int j=0;j<n;j++) {
            for(int k=0;k<n;k++)
                    for(int l=0;l<n;l++) X[i][j]+=P[i][l]*A[l][k]*P[j][k];
            }
      }
}

但是这是 O(n^4),我也可以将它作为两个常规矩阵乘法,所以两次 O(n^3)。我在这里遗漏了什么还是应该坚持使用两次乘法

X = A Transpose(P)
X = P X

【问题讨论】:

  • 有乘法算法faster than O(n^3)
  • 使用 Strassen 算法 (en.wikipedia.org/wiki/Strassen_algorithm) 进行矩阵乘法运算的 O(n^2.81)。基本思想是将每个矩阵分成 4 个子矩阵,该算法使用 7 个子矩阵乘法而不是 8 个。递归地应用这个,你得到 O(n^2.81)。

标签: c++ matrix matrix-multiplication transpose


【解决方案1】:

如果您的目标是快速完成此操作,那么您不必费心编写自己的矩阵乘法算法:使用诸如 Eigen 之类的库。确实有矩阵乘法算法具有比 O(n^3) 更好的渐近时间复杂度,但许多人对渐近时间复杂度过于相信也是事实。

此外,根据使用大型矩阵in scientific research 的经验,它们非常稀疏,因此我认为大型密集矩阵乘法的实际案例少于稀疏矩阵乘法。稀疏矩阵乘法的算法与密集矩阵乘法的算法非常不同。

要回答有关将三个矩阵相乘的问题,您应该进行两次矩阵乘法,但顺序可能很重要。查看Matrix_chain_multiplication。矩阵乘法是关联的。让我们使用维基百科中的示例。 A是10×30矩阵,B是30×5矩阵,C是5×60矩阵。那么,

(AB)C = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500 operations
A(BC) = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000 operations. 

当所有矩阵的大小相同时(如您的问题),这并不重要。

如果您打算继续优化 CPU 上的密集矩阵乘法,您将需要使用循环平铺、SIMD、线程,也许还有汇编。几周后,您可能会写出与 Eigen 竞争的东西。

【讨论】:

    猜你喜欢
    • 2013-06-05
    • 2013-03-21
    • 1970-01-01
    • 2018-12-08
    • 2015-01-11
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多