4 #include <boost/random/mersenne_twister.hpp> 5 #include <boost/random/normal_distribution.hpp> 10 #include "normal_multivar.h" 17 generator_ = boost::random::mt19937(
seed_);
18 distribution_ = boost::random::normal_distribution<double>();
25 generator_ = boost::random::mt19937(
seed_);
26 distribution_ = boost::random::normal_distribution<double>();
30 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>& random_numbers,
31 const Eigen::VectorXd& means,
const Eigen::MatrixXd& cov,
35 Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> lower_cholesky;
39 lower_cholesky = llt.matrixL();
41 if (llt.info() == Eigen::NumericalIssue) {
42 throw std::runtime_error(
43 "\nERROR: In NormalMultivar::generate method: Input covariance matrix is not " 44 "positive semi-definite\n");
46 }
catch (
const std::exception& e) {
47 std::cerr <<
"\nERROR: In normal multivariate random number generation: " 48 << e.what() << std::endl;
52 random_numbers.resize(cov.rows(), cases);
56 for (
unsigned int i = 0; i < random_numbers.cols(); ++i) {
57 for (
unsigned int j = 0; j < random_numbers.rows(); ++j) {
58 random_numbers(j, i) = distribution_(generator_);
63 for (
unsigned int i = 0; i < random_numbers.cols(); ++i) {
64 random_numbers.col(i) = lower_cholesky * random_numbers.col(i) + means;
71 return "NormalMultiVar";
bool generate(Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > &random_numbers, const Eigen::VectorXd &means, const Eigen::MatrixXd &cov, unsigned int cases=1) override
std::string name() const override