我正在尝试计算形式K = P * C.T * S ^ -1(卡尔曼滤波器的实现)的表达式
所有涉及的矩阵都是稀疏的,我当然希望避免计算实际的逆矩阵.
我试过用
import scipy.sparse.linalg as spln
self.K = self.P.dot(spln.spsolve(S.T, C).T)
问题是spsolve期望它的第二个参数是一个向量而不是一个矩阵.
编辑:
澄清,Matlab中的问题可以通过K = P *(C / S)来解决,所以我正在寻找的是一种类似于spsolve但可以接受矩阵作为其第二个参数的方法.这当然可以通过将C分成多个列向量c1..cn并解决它们中的每一个然后将它们重新组装成矩阵来完成,但我怀疑这样做既麻烦又低效.
EDIT2和3:
矩阵的尺寸通常约为P~10×10 ^ 6,S~100×100,C = 100×10 6. P对角线和S对称,C每行只有一个元素.
它将用于使用稀疏矩阵的卡尔曼滤波器的实现,参见
最佳答案 作为一种解决方法可以做到
import numpy as np
from scipy.sparse.linalg import splu
def spsolve2(a, b):
a_lu = splu(a)
out = np.empty((A.shape[1], b.shape[1]))
for j in xrange(b.shape[1]):
out[:,j] = a_lu.solve(b[:,j])
return out
self.K = self.P.dot(spsolve2(S.T, C).T)
但是,是的,这是一个spsolve不接受矩阵的错误.
但是,由于你的S不是很大,你也可以使用密集逆.