39 #include <eigen3/Eigen/Core>
40 #include <eigen3/Eigen/Cholesky>
41 #include <boost/random/variate_generator.hpp>
42 #include <boost/random/normal_distribution.hpp>
43 #include <boost/random/mersenne_twister.hpp>
51 class MultivariateGaussian
54 template <
typename Derived1,
typename Derived2>
55 MultivariateGaussian(
const Eigen::MatrixBase<Derived1>& mean,
const Eigen::MatrixBase<Derived2>& covariance);
57 template <
typename Derived>
58 void sample(Eigen::MatrixBase<Derived>& output);
61 Eigen::VectorXd
mean_;
68 boost::variate_generator<boost::mt19937, boost::normal_distribution<> >
gaussian_;
73 template <
typename Derived1,
typename Derived2>
75 const Eigen::MatrixBase<Derived2>& covariance)
77 , covariance_(covariance)
78 , covariance_cholesky_(covariance_.llt().matrixL())
80 , normal_dist_(0.0, 1.0)
81 , gaussian_(rng_, normal_dist_)
87 template <
typename Derived>
88 void MultivariateGaussian::sample(Eigen::MatrixBase<Derived>& output)
90 for (
int i = 0; i < size_; ++i)
91 output(i) = gaussian_();
92 output = mean_ + covariance_cholesky_ * output;