@@ -50,30 +50,30 @@ type EKF struct {
5050// - invalid state or output noise is given: noise covariance must either be nil or match the model dimensions
5151func New (m filter.Model , init filter.InitCond , q , r filter.Noise ) (* EKF , error ) {
5252 // size of the input and output vectors
53- in , out := m .Dims ()
54- if in <= 0 || out <= 0 {
55- return nil , fmt .Errorf ("Invalid model dimensions: [%d x %d]" , in , out )
53+ nx , _ , ny , _ := m .SystemDims ()
54+ if nx <= 0 || ny <= 0 {
55+ return nil , fmt .Errorf ("invalid model dimensions: [%d x %d]" , nx , ny )
5656 }
5757
5858 if q != nil {
59- if q .Cov ().Symmetric () != in {
60- return nil , fmt .Errorf ("Invalid state noise dimension: %d" , q .Cov ().Symmetric ())
59+ if q .Cov ().Symmetric () != nx {
60+ return nil , fmt .Errorf ("invalid state noise dimension: %d" , q .Cov ().Symmetric ())
6161 }
6262 } else {
6363 q , _ = noise .NewNone ()
6464 }
6565
6666 if r != nil {
67- if r .Cov ().Symmetric () != out {
68- return nil , fmt .Errorf ("Invalid output noise dimension: %d" , r .Cov ().Symmetric ())
67+ if r .Cov ().Symmetric () != ny {
68+ return nil , fmt .Errorf ("invalid output noise dimension: %d" , r .Cov ().Symmetric ())
6969 }
7070 } else {
7171 r , _ = noise .NewNone ()
7272 }
7373
7474 // propagation Jacobian
7575 fJacFn := func (u mat.Vector ) func ([]float64 , []float64 ) {
76- q , _ := noise .NewZero (in )
76+ q , _ := noise .NewZero (nx )
7777
7878 return func (xOut , xNow []float64 ) {
7979 x := mat .NewVecDense (len (xNow ), xNow )
@@ -87,11 +87,11 @@ func New(m filter.Model, init filter.InitCond, q, r filter.Noise) (*EKF, error)
8787 }
8888 }
8989 }
90- f := mat .NewDense (in , in , nil )
90+ f := mat .NewDense (nx , nx , nil )
9191
9292 // observation Jacobian
9393 hJacFn := func (u mat.Vector ) func ([]float64 , []float64 ) {
94- r , _ := noise .NewZero (out )
94+ r , _ := noise .NewZero (ny )
9595
9696 return func (y , xNow []float64 ) {
9797 x := mat .NewVecDense (len (xNow ), xNow )
@@ -106,7 +106,7 @@ func New(m filter.Model, init filter.InitCond, q, r filter.Noise) (*EKF, error)
106106 }
107107 }
108108 }
109- h := mat .NewDense (out , in , nil )
109+ h := mat .NewDense (ny , nx , nil )
110110
111111 // initialize covariance matrix to initial condition covariance
112112 p := mat .NewSymDense (init .Cov ().Symmetric (), nil )
@@ -116,10 +116,10 @@ func New(m filter.Model, init filter.InitCond, q, r filter.Noise) (*EKF, error)
116116 pNext := mat .NewSymDense (init .Cov ().Symmetric (), nil )
117117
118118 // innovation vector
119- inn := mat .NewVecDense (out , nil )
119+ inn := mat .NewVecDense (ny , nil )
120120
121121 // kalman gain
122- k := mat .NewDense (in , out , nil )
122+ k := mat .NewDense (nx , ny , nil )
123123
124124 return & EKF {
125125 m : m ,
@@ -143,7 +143,7 @@ func (k *EKF) Predict(x, u mat.Vector) (filter.Estimate, error) {
143143 // propagate input state to the next step
144144 xNext , err := k .m .Propagate (x , u , k .q .Sample ())
145145 if err != nil {
146- return nil , fmt .Errorf ("System state propagation failed: %v" , err )
146+ return nil , fmt .Errorf ("system state propagation failed: %v" , err )
147147 }
148148
149149 // calculate propagation Jacobian matrix
@@ -174,16 +174,16 @@ func (k *EKF) Predict(x, u mat.Vector) (filter.Estimate, error) {
174174// Update corrects state x using the measurement z, given control intput u and returns corrected estimate.
175175// It returns error if either invalid state was supplied or if it fails to calculate system output estimate.
176176func (k * EKF ) Update (x , u , z mat.Vector ) (filter.Estimate , error ) {
177- in , out := k .m .Dims ()
177+ nx , _ , ny , _ := k .m .SystemDims ()
178178
179- if z .Len () != out {
180- return nil , fmt .Errorf ("Invalid measurement supplied: %v" , z )
179+ if z .Len () != ny {
180+ return nil , fmt .Errorf ("invalid measurement supplied: %v" , z )
181181 }
182182
183183 // observe system output in the next step
184184 y , err := k .m .Observe (x , u , k .r .Sample ())
185185 if err != nil {
186- return nil , fmt .Errorf ("Failed to observe system output: %v" , err )
186+ return nil , fmt .Errorf ("failed to observe system output: %v" , err )
187187 }
188188
189189 // calculate observation Jacobian matrix
@@ -192,8 +192,8 @@ func (k *EKF) Update(x, u, z mat.Vector) (filter.Estimate, error) {
192192 Concurrent : true ,
193193 })
194194
195- pxy := mat .NewDense (in , out , nil )
196- pyy := mat .NewDense (out , out , nil )
195+ pxy := mat .NewDense (nx , ny , nil )
196+ pyy := mat .NewDense (ny , ny , nil )
197197
198198 // P*H'
199199 pxy .Mul (k .pNext , k .h .T ())
@@ -209,7 +209,7 @@ func (k *EKF) Update(x, u, z mat.Vector) (filter.Estimate, error) {
209209 // calculate Kalman gain
210210 pyyInv := & mat.Dense {}
211211 if err := pyyInv .Inverse (pyy ); err != nil {
212- return nil , fmt .Errorf ("Failed to calculat Pyy inverse: %v" , err )
212+ return nil , fmt .Errorf ("failed to calculat Pyy inverse: %v" , err )
213213 }
214214 gain := & mat.Dense {}
215215 gain .Mul (pxy , pyyInv )
@@ -257,8 +257,8 @@ func (k *EKF) Update(x, u, z mat.Vector) (filter.Estimate, error) {
257257 k .inn .CopyVec (inn )
258258 k .k .Copy (gain )
259259 // update EKF covariance matrix
260- for i := 0 ; i < in ; i ++ {
261- for j := i ; j < in ; j ++ {
260+ for i := 0 ; i < nx ; i ++ {
261+ for j := i ; j < nx ; j ++ {
262262 k .p .SetSym (i , j , pCorr .At (i , j ))
263263 }
264264 }
@@ -310,11 +310,11 @@ func (k *EKF) Cov() mat.Symmetric {
310310// It returns error if either cov is nil or its dimensions are not the same as EKF covariance dimensions.
311311func (k * EKF ) SetCov (cov mat.Symmetric ) error {
312312 if cov == nil {
313- return fmt .Errorf ("Invalid covariance matrix: %v" , cov )
313+ return fmt .Errorf ("invalid covariance matrix: %v" , cov )
314314 }
315315
316316 if cov .Symmetric () != k .p .Symmetric () {
317- return fmt .Errorf ("Invalid covariance matrix dims: [%d x %d]" , cov .Symmetric (), cov .Symmetric ())
317+ return fmt .Errorf ("invalid covariance matrix dims: [%d x %d]" , cov .Symmetric (), cov .Symmetric ())
318318 }
319319
320320 k .p .CopySym (cov )
0 commit comments