我正在尝试计算形式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每行只有一个元素。 它将用于使用稀疏矩阵实现卡尔曼滤波器,参见
http://en.wikipedia.org/wiki/Kalman_filter#The_Kalman_filter
答案 0 :(得分:2)
作为解决方法可以做到
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
不是很大,您也可以使用密集反转。