@@ -290,7 +290,8 @@ struct KalmanFilter{NT<:Real, SM<:LinModel} <: StateEstimator{NT}
290290 Q̂, R̂ = Hermitian (Q̂, :L ), Hermitian (R̂, :L )
291291 P̂_0 = Hermitian (P̂_0, :L )
292292 P̂ = copy (P̂_0)
293- K̂, M̂ = zeros (NT, nx̂, nym), zeros (NT, nx̂, nym)
293+ K̂ = zeros (NT, nx̂, nym)
294+ M̂ = Hermitian (zeros (NT, nym, nym), :L )
294295 corrected = [false ]
295296 buffer = StateEstimatorBuffer {NT} (nu, nx̂, nym, ny, nd)
296297 return new {NT, SM} (
@@ -411,6 +412,9 @@ It implements the time-varying Kalman Filter in its predictor (observer) form :
411412 \m athbf{ŷ^m}(k) &= \m athbf{Ĉ^m x̂}_{k-1}(k) + \m athbf{D̂_d^m d}(k) \\
412413 \m athbf{x̂}_{k}(k+1) &= \m athbf{Â x̂}_{k-1}(k) + \m athbf{B̂_u u}(k) + \m athbf{B̂_d d}(k)
413414 + \m athbf{K̂}(k)[\m athbf{y^m}(k) - \m athbf{ŷ^m}(k)] \\
415+
416+
417+
414418 \m athbf{P̂}_{k}(k+1) &= \m athbf{Â}[\m athbf{P̂}_{k-1}(k)
415419 - \m athbf{M̂}(k)\m athbf{Ĉ^m P̂}_{k-1}(k)]\m athbf{Â}' + \m athbf{Q̂}
416420\e nd{aligned}
@@ -801,7 +805,8 @@ struct ExtendedKalmanFilter{NT<:Real, SM<:SimModel} <: StateEstimator{NT}
801805 Q̂ = Hermitian (Q̂, :L )
802806 R̂ = Hermitian (R̂, :L )
803807 P̂ = copy (P̂_0)
804- K̂, M̂ = zeros (NT, nx̂, nym), zeros (NT, nx̂, nym)
808+ K̂ = zeros (NT, nx̂, nym)
809+ M̂ = Hermitian (zeros (NT, nym, nym), :L )
805810 F̂_û, Ĥ = zeros (NT, nx̂+ nu, nx̂), zeros (NT, ny, nx̂)
806811 corrected = [false ]
807812 buffer = StateEstimatorBuffer {NT} (nu, nx̂, nym, ny, nd)
@@ -996,19 +1001,25 @@ See [`update_estimate_kf!`](@ref) for more information.
9961001function correct_estimate_kf! (estim:: StateEstimator , y0m, d0, Ĉm)
9971002 R̂, M̂, K̂ = estim. R̂, estim. M̂, estim. K̂
9981003 x̂0, P̂ = estim. x̂0, estim. P̂
999- mul! (M̂, P̂. data, Ĉm' ) # the ".data" weirdly removes a type instability in mul!
1000- rdiv! (M̂, cholesky! (Hermitian (Ĉm * P̂ * Ĉm' .+ R̂, :L )))
1001- # TODO : use M̂ matrix for something else e.g. M̂ = Ĉm * P̂ * Ĉm' .+ R̂ (would be Hermitian)
1002- K̂ .= M̂
1004+ P̂_Ĉmᵀ = K̂
1005+ mul! (P̂_Ĉmᵀ, P̂. data, Ĉm' ) # the ".data" weirdly removes a type instability in mul!
1006+ mul! (M̂, Ĉm, P̂_Ĉmᵀ)
1007+ M̂ .+ = R̂
1008+ K̂ = P̂_Ĉmᵀ
1009+ M̂_chol = cholesky! (Hermitian (M̂)) # also modifies M̂
1010+ rdiv! (K̂, M̂_chol)
10031011 ŷ0 = estim. buffer. ŷ
10041012 ĥ! (ŷ0, estim, estim. model, x̂0, d0)
10051013 ŷ0m = @views ŷ0[estim. i_ym]
10061014 v̂ = ŷ0m
10071015 v̂ .= y0m .- ŷ0m
10081016 x̂0corr, P̂corr = estim. x̂0, estim. P̂
10091017 mul! (x̂0corr, K̂, v̂, 1 , 1 )
1010- # TODO : use buffer.P̂ to reduce allocations
1011- P̂corr .= Hermitian ((I - M̂* Ĉm) * P̂, :L )
1018+ I_minus_K̂_Ĉm = estim. buffer. P̂
1019+ mul! (I_minus_K̂_Ĉm, K̂, Ĉm)
1020+ lmul! (- 1 , I_minus_K̂_Ĉm)
1021+ I_minus_K̂_Ĉm[diagind (I_minus_K̂_Ĉm)] .+ = 1 # compute I - K̂*Ĉm
1022+ P̂corr .= Hermitian (I_minus_K̂_Ĉm * P̂) # TODO : remove this allocation
10121023 return nothing
10131024end
10141025
0 commit comments