28 #include <boost/random.hpp> 29 #include <boost/random/variate_generator.hpp> 30 #include <boost/random/normal_distribution.hpp> 32 #include <eigen3/Eigen/Core> 33 #include <eigen3/Eigen/Eigenvalues> 39 using namespace Eigen;
44 boost::mt19937 DistributionGaussian::rng = boost::mt19937(getpid() + time(0));
47 boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >
48 *DistributionGaussian::normal_distribution_unit
49 =
new boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >(
51 boost::normal_distribution<>(0, 1)
55 DistributionGaussian::DistributionGaussian(
const VectorXd& mean,
const MatrixXd& covar)
66 void DistributionGaussian::set_mean(
const VectorXd& mean)
68 assert(mean.size()==mean_.size());
72 double DistributionGaussian::maxEigenValue(
void)
const 74 if (max_eigen_value_<0.0)
76 SelfAdjointEigenSolver<MatrixXd> eigensolver(covar_);
77 if (eigensolver.info() == Success)
80 VectorXd eigen_values = eigensolver.eigenvalues();
81 max_eigen_value_ = eigen_values.maxCoeff();
84 return max_eigen_value_;
89 void DistributionGaussian::set_covar(
const MatrixXd& covar) {
90 assert(covar.cols()==covar.rows());
91 assert(covar.rows()==mean_.size());
93 covar_decomposed_ = MatrixXd::Zero(0,0);
94 max_eigen_value_ = -1.0;
97 void DistributionGaussian::generateSamples(
int n_samples, MatrixXd& samples)
const 99 if (covar_decomposed_.size()==0)
102 MatrixXd A(covar_.llt().matrixL());
103 covar_decomposed_ = A;
109 int n_dims = mean_.size();
110 samples.resize(n_samples,n_dims);
114 for (
int i_sample=0; i_sample<n_samples; i_sample++)
117 for (
int i_dim=0; i_dim<n_dims; i_dim++)
118 z(i_dim) = (*normal_distribution_unit)();
121 samples.row(i_sample) = mean_ + covar_decomposed_*z;
128 output <<
"N([" <<
toString(distribution.mean_) <<
"], ["<<
toString(distribution.covar_) <<
"])";
DistributionGaussian class header file.
std::ostream & operator<<(std::ostream &output, const DistributionGaussian &distribution)
A class for representing a Gaussian distribution.
std::string toString(const Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > &matrix)
Convert an Eigen matrix to a string.
Header file for serialization of Eigen matrices.