0

我有两个大的方形稀疏矩阵 A 和 B,需要计算以下内容:A * B^-1以最有效的方式。我有一种感觉,答案涉及使用scipy.sparse,但我一生都无法弄清楚。

经过广泛的搜索,我遇到了以下线程:Efficient numpy / lapack routine for product of inverse and sparse matrix? 但无法弄清楚最有效的方法是什么。

有人建议使用 scipy 的稀疏模块中内置的 LU 分解,但是当我尝试对样本矩阵执行 LU 时,结果是奇异的(尽管当我只执行 * B^-1 时我得到了答案)。我也听说有人建议使用linalg.spsolve(),但我不知道如何实现它,因为它需要一个向量作为第二个参数。

如果有帮助,一旦我有了解决方案 st A * B^-1 = C,我只需要知道矩阵 C 的一行的值。矩阵大约为 1000x1000 到 1500x1500。

4

1 回答 1

1

实际上 1000x1000 矩阵并没有那么大。您可以在现代台式计算机上使用 numpy.linalg.inv(B) 在不到 1 秒的时间内计算出此类矩阵的逆矩阵。

但是,如果考虑到您只需要一行 C 的事实(实际上经常出现这种情况),您可以重写您的问题,从而提高效率。

让我们写 d_i = [0 0 0 ... 0 1 0 ... 0 ],一个在第 i 个元素上只有一个的向量。如果 ^t 表示转置,您可以编写:

AB^-1 = C <=> A = CB <=> A^t = B^t C^t

对于第 i 行:

A^t d_i = B^t C^t d_i <=> a_i = B^t c_i

所以你有一个线性逆问题,可以使用 numpy.linalg.solve 来解决

ci = np.linalg.solve(B.T, a[i])
于 2012-08-02T08:20:33.467 回答