我想解决一个稀疏线性方程组: A x = b ,其中 A 是a(M x M)阵列, b 是(M x N)阵列, x 是和(M x N)阵列。
我使用以下三种方式解决这个问题:
scipy.linalg.solve(A.toarray(), b.toarray())
,scipy.sparse.linalg.spsolve(A, b)
,scipy.sparse.linalg.splu(A).solve(b.toarray())
#返回密集数组我希望使用迭代scipy.sparse.linalg
方法解决问题:
scipy.sparse.linalg.cg
,scipy.sparse.linalg.bicg
,然而,方法只支持右侧 b 形状(M,)或(M,1)。关于如何将这些方法扩展到(M x N)数组 b ?
的任何想法答案 0 :(得分:6)
迭代求解器和直接求解器之间的关键区别在于,直接求解器可以通过使用分解(通常是Cholesky或LU)来更有效地求解多个右手值,而迭代求解器则可以。这意味着对于直接求解器,同时求解多个列具有计算优势。
另一方面,对于迭代求解器,在同时求解多列时没有计算收益,这可能是cg
的API本身不支持矩阵解决方案的原因, bicg
等等。
正因为如此,像scipy.sparse.linalg.spsolve
这样的直接解决方案可能是您的最佳选择。如果由于某种原因你仍然需要迭代解决方案,我只需要创建一个简单的便利函数:
from scipy.sparse.linalg import bicg
def bicg_solve(M, B):
X, info = zip(*(bicg(M, b) for b in B.T))
return np.transpose(X), info
然后你可以创建一些数据并按如下方式调用它:
import numpy as np
from scipy.sparse import csc_matrix
# create some matrices
M = csc_matrix(np.random.rand(5, 5))
B = np.random.rand(5, 4)
X, info = bicg_solve(M, B)
print(X.shape)
# (5, 4)
任何在右侧接受矩阵的迭代求解器API基本上只是这样的包装器。