我有线性系统要解决,它由大型稀疏矩阵组成。
我一直在使用response = app.requests_session.post(
url,
headers=generate_ride_headers(session.get('access_token')),
json=params
)
库及其scipy.sparse
子库来执行此操作,但我无法使用某些线性求解器。
这是一个为我重现问题的工作示例:
linalg
运行此操作会产生以下错误
from numpy.random import random
from scipy.sparse import csc_matrix
from scipy.sparse.linalg import spsolve, minres
N = 10
A = csc_matrix( random(size = (N,N)) )
A = (A.T).dot(A) # force the matrix to be symmetric, as required by minres
x = csc_matrix( random(size = (N,1)) ) # create a solution vector
b = A.dot(x) # create the RHS vector
# verify shapes and types are correct
print('A', A.shape, type(A))
print('x', x.shape, type(x))
print('b', b.shape, type(b))
# spsolve function works fine
sol1 = spsolve(A, b)
# other solvers throw a incompatible dimensions ValueError
sol2 = minres(A, b)
用于调用 raise ValueError('A and b have incompatible dimensions')
ValueError: A and b have incompatible dimensions
,即使尺寸明确 兼容。 minres
中的其他解算器,例如scipy.sparse.linalg
,cg
和lsqr
都会产生相同的错误。
这是在使用SciPy 0.19的python 3.6.1上运行。
任何人都知道这里发生了什么?
谢谢!
答案 0 :(得分:2)
您的使用与API不兼容!
b
上的
b:ndarray或稀疏矩阵
表示等式右边的矩阵或向量。如果一个向量,b.shape必须是(n,)或(n,1)。
允许稀疏b
b
上的
b:{array,matrix}
线性系统的右侧。有形状(N,)或(N,1)。
这里不允许稀疏b!
这同样适用于所提到的非工作解算器(其中lsqr可能有点不同 - > array_like与数组相比)。
这种情况并不少见,因为稀疏的rhs-vectors在很多情况下没有帮助,因此很多数值优化开发者都不支持!
这有效:
sol2 = minres(A, b.todense())
(你得到了我的赞成和赞美,这是一个很好的可重复的例子!)