求逆矩阵与稀疏矩阵乘积的高效numpy / lapack算法



我有一个矩阵B,它是方形且密集的,矩阵 a 是矩形且稀疏的。

是否有一种方法可以有效地计算乘积B^-1 * A ?

到目前为止,我使用(在numpy中)
tmp = B.inv()
return tmp * A

,我相信,使我们知道A的稀疏性。我在考虑使用稀疏方法numpy.sparse.linalg.spsolve,但这要求B是稀疏的,而不是A。

还有别的方法可以加快速度吗?

由于要反转的矩阵是密集的,spsolve不是你想要的工具。此外,计算矩阵的逆并将其乘以另一个矩阵是不好的数值实践-使用LU分解要好得多,它由scipy支持。

另一点是,除非您使用矩阵类(我认为narray类更好,这是一个品味问题),否则您需要使用dot而不是乘法运算符。如果你想有效地将稀疏矩阵与密集矩阵相乘,你需要使用稀疏矩阵的dot方法。不幸的是,这只适用于如果第一个矩阵是稀疏的,所以你需要使用任何玉米建议的技巧,采取转置交换操作的顺序。

这是一个懒惰的实现,它不使用LU分解,但它应该是有效的:

B_inv = scipy.linalg.inv(B)
C = (A.transpose().dot(B_inv.transpose())).transpose()

正确地使用LU分解需要找到一种有效地将三角矩阵乘以稀疏矩阵的方法,这是我目前无法做到的。

最新更新