4

K = P*CT*S^-1 という形式の式を計算しようとしています (カルマン フィルターの実装)

関連するすべての行列は疎であり、もちろん実際の逆行列を計算することは避けたいと思います。

使ってみた

import scipy.sparse.linalg as spln

self.K = self.P.dot(spln.spsolve(S.T, C).T)

問題は、spsolve が 2 番目の引数が行列ではなくベクトルであると想定していることです。

編集:明確化、問題はMatlabでK = P *(C / S)で解決できるため、私が探しているのはspsolveに似た方法ですが、2番目の引数として行列を受け入れることができます。これはもちろん、C をいくつかの列ベクトル c1..cn に分割し、それぞれの問題を解決してから行列に再構築することで実行できますが、それを行うのは面倒で非効率的であると思われます。

edit2&3: 行列のサイズは通常、P~10⁶x10^6、S~100x100、C=100x10⁶ 程度です。P 対角および S 対称であり、C には行ごとに 1 つの要素しかありません。これは、スパース行列を使用したカルマン フィルターの実装に使用されます。

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 に答える