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