110 Matrix< Scalar, Dynamic, 1> _mean;
115 void set_covar(
const Matrix<Scalar,Dynamic,Dynamic> &covar) { _covar = covar; }
116 void set_transform(
const Matrix<Scalar,Dynamic,Dynamic> &transform) { _transform = transform; }
119 Matrix<Scalar,Dynamic,Dynamic> _covar;
120 Matrix<Scalar,Dynamic,Dynamic> _transform;
123 SelfAdjointEigenSolver<Matrix<Scalar,Dynamic,Dynamic> > _eigenSolver;
127 const uint64_t &seed=std::mt19937::default_seed)
128 :_use_cholesky(use_cholesky)
133 const bool &use_cholesky=
false,
const uint64_t &seed=std::mt19937::default_seed)
134 :_use_cholesky(use_cholesky)
141 void setMean(
const Matrix<Scalar,Dynamic,1>& mean) { _mean = mean; }
142 void setCovar(
const Matrix<Scalar,Dynamic,Dynamic>& covar)
152 Eigen::LLT<Eigen::Matrix<Scalar,Dynamic,Dynamic> > cholSolver(_covar);
157 if (cholSolver.info()==Eigen::Success)
160 _transform = cholSolver.matrixL();
164 throw std::runtime_error(
"Failed computing the Cholesky decomposition. Use solver instead");
169 _eigenSolver = SelfAdjointEigenSolver<Matrix<Scalar,Dynamic,Dynamic> >(_covar);
170 _transform = _eigenSolver.eigenvectors()*_eigenSolver.eigenvalues().cwiseMax(0).cwiseSqrt().asDiagonal();
176 Matrix<Scalar,Dynamic,-1>
samples(
int nn,
double factor)
178 return ((_transform * Matrix<Scalar,Dynamic,-1>::NullaryExpr(_covar.rows(),nn,randN))*factor).colwise() + _mean;
181 Matrix<Scalar,Dynamic,-1> samples_ind(
int nn,
double factor)
183 dMat pop = (Matrix<Scalar,Dynamic,-1>::NullaryExpr(_covar.rows(),nn,randN))*factor;
184 for (
int i=0;i<pop.cols();i++)
186 pop.col(i) = pop.col(i).cwiseProduct(_transform) + _mean;
191 Matrix<Scalar,Dynamic,-1> samples_ind(
int nn)
193 return (Matrix<Scalar,Dynamic,-1>::NullaryExpr(_covar.rows(),nn,randN));