1

我有一个正方形且密集的矩阵B,以及一个矩形且稀疏的矩阵A。

有没有办法有效地计算产品B^-1 * A

到目前为止,我使用(在 numpy 中)

tmp = B.inv()
return tmp * A

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

还有其他方法可以加快速度吗?

4

1 回答 1

3

由于要反转的矩阵很密集,spsolve因此不是您想要的工具。此外,计算矩阵的逆并将其与另一个相乘是不好的数值实践 - 使用scipy 支持的LU 分解会更好。

还有一点是,除非你使用的是矩阵类(我认为ndarray类更好,这是一个品味问题),你需要使用dot而不是乘法运算符。而如果要高效地将稀疏矩阵与稠密矩阵相乘,则需要使用dot稀疏矩阵的方法。不幸的是,这仅在第一个矩阵稀疏的情况下才有效,因此您需要使用 Anycorn 建议采用转置来交换操作顺序的技巧。

这是一个不使用 LU 分解的惰性实现,但在其他方面应该是有效的:

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

正确使用 LU 分解涉及找到一种有效地将三角矩阵乘以稀疏矩阵的方法,目前我还没有做到这一点。

于 2011-07-21T07:05:31.337 回答