28 #ifndef RandomGenerator_H
29 #define RandomGenerator_H
42 using namespace mrpt::utils;
43 using namespace mrpt::math;
69 void MT19937_generateNumbers();
70 void MT19937_initializeGenerator(
const uint32_t &seed);
83 void randomize(
const uint32_t seed);
93 uint32_t drawUniform32bit();
97 return Min + (Max-Min)* drawUniform32bit() * 2.3283064370807973754314699618685e-10;
105 void drawUniformMatrix(
107 const double unif_min = 0,
108 const double unif_max = 1 )
110 for (
size_t r=0;r<matrix.getRowCount();r++)
111 for (
size_t c=0;c<matrix.getColCount();c++)
112 matrix.get_unsafe(r,c) =
static_cast<typename
MAT::value_type>( drawUniform(unif_min,unif_max) );
119 void drawUniformVector(
121 const double unif_min = 0,
122 const double unif_max = 1 )
124 const size_t N = v.size();
125 for (
size_t c=0;c<N;c++)
126 v[c] = static_cast<typename VEC::value_type>( drawUniform(unif_min,unif_max) );
137 double drawGaussian1D_normalized(
double *likelihood = NULL);
144 return mean+std*drawGaussian1D_normalized();
152 void drawGaussian1DMatrix(
154 const double mean = 0,
155 const double std = 1 )
157 for (
size_t r=0;r<matrix.getRowCount();r++)
158 for (
size_t c=0;c<matrix.getColCount();c++)
159 matrix.get_unsafe(r,c) =
static_cast<typename
MAT::value_type>( drawGaussian1D(
mean,std) );
164 CMatrixDouble drawDefinitePositiveMatrix(
const size_t dim,
const double std_scale = 1.0,
const double diagonal_epsilon = 1e-8);
170 void drawGaussian1DVector(
172 const double mean = 0,
173 const double std = 1 )
175 const size_t N = v.size();
176 for (
size_t c=0;c<N;c++)
177 v[c] = static_cast<typename VEC::value_type>( drawGaussian1D(
mean,std) );
185 template <
typename T>
186 void drawGaussianMultivariate(
187 std::vector<T> &out_result,
189 const std::vector<T>*
mean = NULL
198 template <
class VECTORLIKE,
class COVMATRIX>
199 void drawGaussianMultivariate(
200 VECTORLIKE &out_result,
201 const COVMATRIX &
cov,
202 const VECTORLIKE*
mean = NULL
205 const size_t N = cov.rows();
206 ASSERT_(cov.rows()==cov.cols())
210 Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject> eigensolver(cov);
212 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::MatrixType eigVecs = eigensolver.eigenvectors();
213 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::RealVectorType eigVals = eigensolver.eigenvalues();
217 eigVals = eigVals.array().sqrt();
218 for (
typename COVMATRIX::Index i=0;i<eigVecs.cols();i++)
219 eigVecs.col(i) *= eigVals[i];
222 out_result.assign(N,0);
224 for (
size_t i=0;i<N;i++)
226 typename COVMATRIX::Scalar rnd = drawGaussian1D_normalized();
227 for (
size_t d=0;d<N;d++)
228 out_result[d]+= eigVecs.coeff(d,i) * rnd;
231 for (
size_t d=0;d<N;d++)
232 out_result[d]+= (*
mean)[d];
241 template <
typename VECTOR_OF_VECTORS,
typename COVMATRIX>
242 void drawGaussianMultivariateMany(
243 VECTOR_OF_VECTORS &ret,
244 size_t desiredSamples,
245 const COVMATRIX &
cov,
252 Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject> eigensolver(cov);
254 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::MatrixType eigVecs = eigensolver.eigenvectors();
255 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::RealVectorType eigVals = eigensolver.eigenvalues();
259 eigVals = eigVals.array().sqrt();
260 for (
typename COVMATRIX::Index i=0;i<eigVecs.cols();i++)
261 eigVecs.col(i) *= eigVals[i];
264 ret.resize(desiredSamples);
265 const size_t N = cov.cols();
266 for (
size_t k=0;k<desiredSamples;k++)
269 for (
size_t i=0;i<N;i++)
271 typename COVMATRIX::Scalar rnd = drawGaussian1D_normalized();
272 for (
size_t d=0;d<N;d++)
273 ret[k][d]+= eigVecs.coeff(d,i) * rnd;
276 for (
size_t d=0;d<N;d++)
277 ret[k][d]+= (*
mean)[d];
291 void permuteVector(
const VEC &in_vector, VEC &out_result)
293 out_result = in_vector;
294 const size_t N = out_result.size();
296 std::random_shuffle( &out_result[0],&out_result[N-1] );
322 const double unif_min = 0,
323 const double unif_max = 1 )
325 for (
size_t r=0;r<matrix.getRowCount();r++)
326 for (
size_t c=0;c<matrix.getColCount();c++)
335 std::vector<T> &v_out,
336 const T& unif_min = 0,
337 const T& unif_max = 1 )
339 size_t n = v_out.size();
340 for (
size_t r=0;r<n;r++)
351 const double mean = 0,
352 const double std = 1 )
354 for (
size_t r=0;r<matrix.getRowCount();r++)
355 for (
size_t c=0;c<matrix.getColCount();c++)
364 std::vector<T> &v_out,
368 size_t n = v_out.size();
369 for (
size_t r=0;r<n;r++)
387 const std::vector<T> &in_vector,
388 std::vector<T> &out_result)
398 template <
typename T>
401 std::vector<T> &out_result)
416 template <
typename T>
419 size_t desiredSamples,
420 std::vector< std::vector<T> > &ret,
421 std::vector<T> *samplesLikelihoods = NULL)
430 template <
typename T,
size_t N>
433 size_t desiredSamples,
434 std::vector< std::vector<T> > &ret )
443 template <
typename T,
size_t N>
446 std::vector<T> &out_result)