32 #ifndef SHARK_STATISTICS_MULTIVARIATENORMALDISTRIBUTION_H 33 #define SHARK_STATISTICS_MULTIVARIATENORMALDISTRIBUTION_H 49 typedef std::pair<RealVector,RealVector> result_type;
54 m_covarianceMatrix = Sigma;
64 template<
typename Archive>
65 void serialize( Archive & ar,
const std::size_t version ) {
66 ar & BOOST_SERIALIZATION_NVP( m_covarianceMatrix );
67 ar & BOOST_SERIALIZATION_NVP( m_eigenVectors );
68 ar & BOOST_SERIALIZATION_NVP( m_eigenValues );
81 return m_covarianceMatrix;
89 return m_covarianceMatrix;
100 return m_eigenVectors;
105 return m_eigenValues;
110 return m_eigenValues;
114 template<
class RngType>
116 RealVector result( m_eigenValues.size(), 0. );
117 RealVector z( m_eigenValues.size() );
119 for( std::size_t i = 0; i < result.size(); i++ ) {
120 z( i ) =
gauss(rng, 0., 1. );
122 for( std::size_t i = 0; i < result.size(); i++ )
123 for( std::size_t j = 0; j < result.size(); j++ )
124 result( i ) += m_eigenVectors( i, j ) * std::sqrt( std::abs( m_eigenValues(j) ) ) * z( j );
126 return( std::make_pair( result, z ) );
131 eigensymm( m_covarianceMatrix, m_eigenVectors, m_eigenValues );
135 RealMatrix m_covarianceMatrix;
136 RealMatrix m_eigenVectors;
137 RealVector m_eigenValues;
148 typedef std::pair<RealVector,RealVector> result_type;
162 template<
typename Archive>
163 void serialize( Archive & ar,
const std::size_t version ) {
164 ar & BOOST_SERIALIZATION_NVP( m_lowerCholesky);
175 return m_lowerCholesky.size1();
185 return m_lowerCholesky;
190 return m_lowerCholesky;
198 template<
class RngType,
class Vector1,
class Vector2>
199 void generate(RngType& rng, Vector1& y, Vector2& z)
const{
202 for( std::size_t i = 0; i !=
size(); i++ ) {
203 z( i ) =
gauss(rng, 0, 1 );
207 blas::triangular_prod<blas::lower>(m_lowerCholesky,y);
217 template<
class RngType>
220 RealVector& z = result.second;
221 RealVector& y = result.first;