高效的numpy/lapack方法用于反矩阵与稀疏矩阵的乘积?

1 投票
1 回答
1554 浏览
提问于 2025-04-16 21:56

我有一个方阵B,它的元素比较密集,还有一个矩阵A,它是长方形的,并且元素比较稀疏。

有没有什么办法可以高效地计算这个乘积B^-1 * A

到目前为止,我在用numpy做这个:

tmp = B.inv()
return tmp * A

我觉得这样做是利用了A的稀疏特性。我在考虑使用稀疏方法numpy.sparse.linalg.spsolve,但这个方法要求B是稀疏的,而不是A。

有没有其他方法可以加快这个过程呢?

1 个回答

3

因为要反转的矩阵是稠密的,所以 spsolve 这个工具不适合你。此外,计算一个矩阵的逆并用它去乘另一个矩阵是个不好的做法。你最好使用 LU分解,这个在scipy中是支持的。

还有一点是,除非你在使用矩阵类(我觉得ndarray类更好,这个其实是个人喜好问题),否则你需要用 dot 来代替乘法符号。如果你想高效地把一个稀疏矩阵和一个稠密矩阵相乘,你需要使用稀疏矩阵的 dot 方法。不幸的是,这个方法只在第一个矩阵是稀疏的情况下有效,所以你需要用Anycorn建议的技巧,转置矩阵来交换操作的顺序。

这里有一个懒惰的实现,虽然没有使用LU分解,但其他方面应该是高效的:

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

要正确使用LU分解,需要找到一种高效的方法来将一个三角矩阵与稀疏矩阵相乘,但目前我还没有找到合适的方法。

撰写回答