Numpy 涉及倒矩阵的稀疏矩阵乘法

Numpy 涉及倒矩阵的稀疏矩阵乘法,numpy,sparse-matrix,matrix-multiplication,Numpy,Sparse Matrix,Matrix Multiplication,我有两个大的平方稀疏矩阵A和B,需要以最有效的方式计算以下内容:A*B^-1。我有一种感觉,答案涉及到使用scipy.sparse,但我一辈子都想不出来 经过广泛的搜索,我遇到了以下问题:但无法找出最有效的方法 有人建议使用scipy的稀疏模块中内置的LU分解,但当我尝试对样本矩阵执行LU时,会说结果是奇异的(尽管当我只执行a*B^-1时,我得到了一个答案)。我还听到有人建议使用linalg.spsolve(),但我不知道如何实现它,因为它需要一个向量作为第二个参数 如果有帮助的话,一旦我得到解

我有两个大的平方稀疏矩阵A和B,需要以最有效的方式计算以下内容:
A*B^-1
。我有一种感觉,答案涉及到使用
scipy.sparse
,但我一辈子都想不出来

经过广泛的搜索,我遇到了以下问题:但无法找出最有效的方法

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


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

实际上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

这些矩阵有多大?谢谢!我会试试这个,让你知道它是怎么回事。另外,我知道做反转不会花很长时间,但我必须做成千上万次这个过程,所以我想尽可能地对它进行微调:)我尝试了一下,在挠头了一段时间后,我让它开始工作。您的解决方案在使用
numpy.linalg.solve()
时有效,但在使用
sparse.linalg.spsolve
时,我得到了错误的答案。我的数组如下:
B.T=[[0.802,-0.396,0.],[-0.594,0.604,0.],[-0.198,-0.198,0.01]
A.T:[.25,5,0.],[.75,5,0.],[.0,0.],[.0,0,1.]
;第二行的正确答案是
[2.00654938,2.80114293,95.19230769]
,但spsolve吐出
[5,5,0]
Ok。我假设spsolve与solve的工作原理相同,但事实显然并非如此。但事实上,我不太确定,从现在的情况来看,使用稀疏矩阵是否能提高速度。主要的优点是内存消耗,但您可能不受此限制,对吗?我将不得不等到稍后的实现中才能确定是否有速度提升(以及是否内存受限)。我终于遇到了一个有类似问题的人。看起来spsolve在64位windows环境中有问题(使用EPD+MKL时),只返回传递给它的第二个参数。但我在Ubuntu版的EPD上测试了它,效果很好。
A^t d_i = B^t C^t d_i <=> a_i = B^t c_i
ci = np.linalg.solve(B.T, a[i])