我的矩阵 B 是方形和密集的,矩阵 A 是矩形和稀疏的。
有没有办法有效地计算产品B^-1 * A
?
到目前为止,我使用(在numpy中)
tmp = B.inv()
return tmp * A
我相信,这让我们知道A的稀疏性。我在考虑使用稀疏方法
numpy.sparse.linalg.spsolve
,但这需要B而不是A稀疏。
还有另一种方法可以加快速度吗?
答案 0 :(得分:3)
由于要反转的矩阵是密集的,spsolve
不是您想要的工具。另外,计算矩阵的逆并将其乘以另一个矩阵是不好的数值实践 - 你最好使用scipy支持的LU decomposition。
另一点是,除非你使用矩阵类(我认为ndarray类更好,这是一个品味问题),你需要使用dot
而不是乘法运算符。如果要通过密集矩阵有效地乘以稀疏矩阵,则需要使用稀疏矩阵的dot
方法。不幸的是,这仅在第一个矩阵稀疏时才有效,所以你需要使用Anycorn建议采用转置来交换操作顺序的技巧。
这是一个懒惰的实现,它不使用LU分解,但应该有效:
B_inv = scipy.linalg.inv(B)
C = (A.transpose().dot(B_inv.transpose())).transpose()
使用LU分解正确地执行它涉及找到一种方法来有效地将三角矩阵乘以稀疏矩阵,这是目前无法实现的。