最快的方式转换共轭"

时间:2015-12-17 08:48:23

标签: c++ matrix matrix-multiplication transpose

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

 

我在想最快的方法是

Product:  DbVisualizer Free 6.5.4
Build:  #1362 (2009/02/05 20:09)
Java VM:  Java HotSpot(TM) Client VM
Java Version:  1.8.0_25
Java Vendor:  Oracle Corporation
OS Name:  Windows XP
OS Arch:  x86
OS Version:  5.1

An error occurred while establishing the connection:
   Type: javax.naming.CommunicationException
Message:
   Cannot connect to ORB

然而,这是O(n ^ 4),我也可以将它作为两个常规矩阵乘法,因此两次O(n ^ 3)。我在这里遗漏了什么,或者我应该坚持两次乘法

X = P A Transpose(P)

1 个答案:

答案 0 :(得分:3)

如果您的目标是快速执行此操作,那么您不应该费心编写自己的矩阵乘法算法:使用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竞争的东西。