2012-08-02 225 views
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(),但我不知道如何实现这一点,因为它需要一个向量作为第二个参数。

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

+0

这些矩阵有多大? – irrelephant 2012-08-02 04:06:55

回答

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]) 
+0

谢谢!我会试试这个,让你知道它是怎么回事。另外,我知道不需要很长时间来进行反演,但是我将不得不做这个过程数万次,所以我想尽可能地微调它:) – user1554752 2012-08-02 14:22:18

+0

我试过了,之后有点抓挠我的头,我得到它的工作。你的解决方案在使用'numpy.linalg.solve()'的时候起作用,但是当使用'sparse.linalg.spsolve'时我得到了一个不正确的答案。我的阵列中有以下几项:'BT = [[0.802,-0.396,0。],[-0.594,0.604,0。],[-0.198,-0.198,0.01]]和AT:[[.25, 。.5,0],[75,.5,0],[0,.0,1]]'。。第二行的正确答案是'[2.00654938,2.80114293,95.19230769]',但是spuffve吐出'[.5,.5,.0]' – user1554752 2012-08-02 21:46:51

+0

好吧。我认为spsolve的工作方式与解决问题的方法相同,但显然并非如此。但实际上我不确定从现在的位置开始,使用稀疏矩阵将使您获得更快的速度。主要优势是内存消耗,但是你可能不会受限于此,对吧? – 2012-08-03 08:39:22