MUQ  0.4.3
KalmanSmoother.cpp
Go to the documentation of this file.
2 
3 #include <Eigen/Dense>
4 
5 using namespace muq::Modeling;
6 using namespace muq::Inference;
7 
8 
9 std::pair<Eigen::VectorXd, Eigen::MatrixXd> KalmanSmoother::Analyze(std::pair<Eigen::VectorXd, Eigen::MatrixXd> const& currDist_t,
10  std::pair<Eigen::VectorXd, Eigen::MatrixXd> const& nextDist_t,
11  std::pair<Eigen::VectorXd, Eigen::MatrixXd> const& nextDist_n,
12  std::shared_ptr<muq::Modeling::LinearOperator> F)
13 {
14  std::pair<Eigen::VectorXd, Eigen::MatrixXd> output;
15 
16  Eigen::MatrixXd C = ComputeC(currDist_t.second, nextDist_t.second, F);
17 
18  output.first = currDist_t.first + C*(nextDist_n.first - nextDist_t.first);
19  output.second = currDist_t.second + C*(nextDist_n.second - nextDist_t.second).selfadjointView<Eigen::Lower>()*C.transpose();
20 
21  return output;
22 
23 }
24 
25 
26 Eigen::MatrixXd KalmanSmoother::ComputeC(Eigen::MatrixXd const& currDist_t_cov,
27  Eigen::MatrixXd const& nextDist_t_cov,
28  std::shared_ptr<muq::Modeling::LinearOperator> const& F)
29 {
30  return nextDist_t_cov.ldlt().solve( F->Apply(currDist_t_cov) ).transpose();
31 }