0

行列演算を行っているカルマンフィルターの実装があります。ある時点で、2 つの 1x1 行列を減算する必要があります。どこから来たのかわからないエラーがあります。Pythonで行列演算を行う最良の方法は何ですか?

import numpy as np
import pylab as pl
import scipy as Sci
import scipy.linalg as linalg

class GetPos(object):
    def __init__(self):
        self.Posp = 0
        self.Velp = 80
        self.z = np.matrix(0)
    def __repr__(self):
        return "from GetPos.__repr__ z=%s" % (self.z)
    def __call__(self):
        self.dt = 0.1
        self.w = 0 + 10*np.random.random()
        self.v = 0 + 10*np.random.random()            
        self.z = self.Posp + self.Velp*self.dt + self.v
        self.Posp = self.z - self.v
        self.Velp = 80 + self.w
        print 'from GetPos.__call__ z = %s' % self.z
        return self.z

class DvKalman(object):
    def __init__(self):
        self.dt = .1
        self.A = np.matrix([[1., self.dt],[0,1]])
        self.H = np.matrix([1., 0])
        self.Q = np.matrix([[1,0.],[0,3]])
        self.R = np.matrix(10)
        self.x = np.matrix([0,20]).T
        self.P = np.matrix(5*np.eye(2))
        #print 'P matrix \n%s' % self.P
        self.firstRun = 0
    def __call__(self, z):
        self.z = z
        print 'from DvKalman.__call__ slef.z = %s and z = %s' % (self.z,z)
        self.xp = self.A * self.x
        self.Pp = self.A*self.P*self.A.T  + self.Q
        self.K = self.Pp * self.H.T * linalg.inv(np.absolute(self.H*self.Pp*self.H.T + self.R));
        print 'from DvKalman.__call__  z=%s, \npreviouse x=\n%s \nH = \n%s \nand P=\n%s \nand xp=\n%s,\n Pp = \n%s,\n K=\n%s' % (self.z,self.x,self.H, self.P,self.xp,self.Pp,self.K)
        newM1 = self.H*self.xp    
        print 'This is self.H*self.xp %s and this is self.z = %s' % (newM1, self.z)
        newM2 = self.z - self.H*self.xp
        print 'This should give simple substruction %s' % newM2                 
        self.x = self.xp + self.K*(self.z - self.H*self.xp)
        self.P = self.Pp - self.K*self.H*self.Pp
        print 'new values x=%s and P=%s' % (self.x,self.P)
        return (self.x)
def TestDvKalman():
    Nsamples = np.arange(0,10,.1)

    kal = DvKalman()
    #print type(kal)
    Xsaved = []
    Zsaved = []

    for i in range(len(Nsamples)):
        z = GetPos()
        print z
        print 'from TestDvKalman zpos = %s' % z
        Zsaved.append(z)
        [position, velocity] = kal(z)
        print position, velocity
        Xsaved.append([position, velocity])
    print Zsaved
    print Xsaved
#    f1 = pl.subplot(121)
#    f1 = pl.plot(Xsaved, 'x-',label = 'Xsaved')
#    f1 = pl.legend()
#    
#    f2 = pl.subplot(122)
#    f2 = pl.title('Kalman Velocity')
#    f2 = pl.plot(Zsaved, 'o-', color = 'brown',label = 'Zsaved')
#    f2 = pl.legend()
#    
#    pl.show()

if __name__ == '__main__':  
    TestDvKalman()

コードを追跡してデバッグするために数行を追加しprint、コードに含まれない新しい変数を追加newMしました。行列は正しく印刷されますThis is self.H*self.xp [[ 2.]] and this is self.z = from GetPos.__repr__ z=[[0]]両方の行列は 1x1 ですが、それでもエラーが表示されます。理由はわかりません。エラーは次のとおりです。

    newM2 = self.z - self.H*self.xp
TypeError: unsupported operand type(s) for -: 'GetPos' and 'matrix'

どこかでタイプを台無しにしていると思われますが、どこをどのように修正すればよいかわかりません。エラーの場所と、今後同様のエラーを回避するためにそのようなコードを作成する方法を教えてください。

4

3 に答える 3

2

TestDvKalman、この行

    z = GetPos()

zのインスタンスに設定しますGetPoskalこれを次の行の引数として使用します。

    [position, velocity] = kal(z)

したがって、の__call__メソッドにDvKalmanは、のインスタンスが与えられGetPos、これを。として保存しself.zます。その結果、次の行でエラーが発生します。

    newM2 = self.z - self.H*self.xp
于 2012-10-23T12:40:36.927 に答える
2

GetPos インスタンスを DvKalman__call__メソッドに渡しています。したがって、GetPos インスタンスとマトリックスを減算しようとしています。マトリックスとマトリックスではありません。

于 2012-10-23T12:38:07.117 に答える