4

我正在尝试计算 K = P*CT*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⁶x10^6、S~100x100、C=100x10⁶ 左右。P对角线和S对称,C每行只有一个元素。它将用于使用稀疏矩阵实现卡尔曼滤波器,请参阅

http://en.wikipedia.org/wiki/Kalman_filter#The_Kalman_filter

4

1 回答 1

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的不是很大,您也可以使用密集逆。

于 2011-10-18T21:12:53.303 回答