[英]Matrix subtraction in python/numpy
我在做矩陣運算的地方有一個卡爾曼濾波器的實現。 在某些時候,我應該減去兩個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'
我懷疑我在某個地方弄亂了類型,但不知道在哪里以及如何更正它。 您能指出我的錯誤在哪里,以及如何構建類似的代碼以避免將來出現類似的錯誤嗎?
您正在將GetPos實例傳遞給DvKalman __call__
方法。 因此,您嘗試減去一個GetPos實例和一個矩陣。 不是矩陣和矩陣。
在TestDvKalman
,此行
z = GetPos()
將z
設置為GetPos
的實例。 您可以在以下行kal
其用作kal
的參數:
[position, velocity] = kal(z)
所以__call__
方法DvKalman
給出的實例GetPos
,其中保存為self.z
。 這導致在此行出現錯誤:
newM2 = self.z - self.H*self.xp
將newM2 = self.z - self.H*self.xp
為newM2 = self.z() - self.H*self.xp
該程序應該可以使用該程序(但是我無法確認它是否想要您想要)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.