Python将矩阵的乘法与稀疏矩阵的逆相加

时间:2011-10-14 12:59:28

标签: python numpy scipy sparse-matrix linear-equation

我正在尝试计算形式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

1 个答案:

答案 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不是很大,您也可以使用密集反转。