9 #ifndef RandomGenerator_H
10 #define RandomGenerator_H
17 namespace math {
template <
class T>
class CMatrixTemplateNumeric; }
50 void MT19937_generateNumbers();
51 void MT19937_initializeGenerator(
const uint32_t &seed);
64 void randomize(
const uint32_t seed);
74 uint32_t drawUniform32bit();
77 uint64_t drawUniform64bit();
84 template <
typename T,
typename U,
typename V>
87 const T range = max_val-min_val+1;
89 drawUniformUnsignedInt(rnd);
90 ret_number=min_val+ (rnd%range);
95 return Min + (Max-Min)* drawUniform32bit() * 2.3283064370807973754314699618685e-10;
105 const double unif_min = 0,
106 const double unif_max = 1 )
108 for (
size_t r=0;r<matrix.getRowCount();r++)
109 for (
size_t c=0;c<matrix.getColCount();c++)
110 matrix.get_unsafe(r,c) =
static_cast<typename MAT::Scalar
>( drawUniform(unif_min,unif_max) );
119 const double unif_min = 0,
120 const double unif_max = 1 )
122 const size_t N = v.size();
123 for (
size_t c=0;c<N;c++)
135 double drawGaussian1D_normalized(
double *likelihood = NULL);
142 return mean+std*drawGaussian1D_normalized();
152 const double mean = 0,
153 const double std = 1 )
155 for (
size_t r=0;r<matrix.getRowCount();r++)
156 for (
size_t c=0;c<matrix.getColCount();c++)
157 matrix.get_unsafe(r,c) =
static_cast<typename MAT::Scalar
>( drawGaussian1D(
mean,
std) );
162 mrpt::math::CMatrixDouble drawDefinitePositiveMatrix(
const size_t dim,
const double std_scale = 1.0,
const double diagonal_epsilon = 1e-8);
170 const double mean = 0,
171 const double std = 1 )
173 const size_t N = v.size();
174 for (
size_t c=0;c<N;c++)
183 template <
typename T>
184 void drawGaussianMultivariate(
185 std::vector<T> &out_result,
187 const std::vector<T>*
mean = NULL
196 template <
class VECTORLIKE,
class COVMATRIX>
198 VECTORLIKE &out_result,
199 const COVMATRIX &
cov,
200 const VECTORLIKE*
mean = NULL
203 const size_t N = cov.rows();
204 ASSERT_(cov.rows()==cov.cols())
208 Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject> eigensolver(cov);
210 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::MatrixType eigVecs = eigensolver.eigenvectors();
211 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::RealVectorType eigVals = eigensolver.eigenvalues();
215 eigVals = eigVals.array().sqrt();
216 for (
typename COVMATRIX::Index i=0;i<eigVecs.cols();i++)
217 eigVecs.col(i) *= eigVals[i];
220 out_result.assign(N,0);
222 for (
size_t i=0;i<N;i++)
224 typename COVMATRIX::Scalar rnd = drawGaussian1D_normalized();
225 for (
size_t d=0;d<N;d++)
226 out_result[d]+= eigVecs.coeff(d,i) * rnd;
229 for (
size_t d=0;d<N;d++)
230 out_result[d]+= (*
mean)[d];
239 template <
typename VECTOR_OF_VECTORS,
typename COVMATRIX>
241 VECTOR_OF_VECTORS &ret,
242 size_t desiredSamples,
243 const COVMATRIX &
cov,
244 const typename VECTOR_OF_VECTORS::value_type *
mean = NULL )
250 Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject> eigensolver(cov);
252 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::MatrixType eigVecs = eigensolver.eigenvectors();
253 typename Eigen::SelfAdjointEigenSolver<typename COVMATRIX::PlainObject>::RealVectorType eigVals = eigensolver.eigenvalues();
257 eigVals = eigVals.array().sqrt();
258 for (
typename COVMATRIX::Index i=0;i<eigVecs.cols();i++)
259 eigVecs.col(i) *= eigVals[i];
262 ret.resize(desiredSamples);
263 const size_t N = cov.cols();
264 for (
size_t k=0;k<desiredSamples;k++)
267 for (
size_t i=0;i<N;i++)
269 typename COVMATRIX::Scalar rnd = drawGaussian1D_normalized();
270 for (
size_t d=0;d<N;d++)
271 ret[k][d]+= eigVecs.coeff(d,i) * rnd;
274 for (
size_t d=0;d<N;d++)
275 ret[k][d]+= (*
mean)[d];
291 out_result = in_vector;
292 const size_t N = out_result.size();
294 std::random_shuffle( &out_result[0],&out_result[N-1] );
310 return randomGenerator.drawUniform32bit() % i;
320 const double unif_min = 0,
321 const double unif_max = 1 )
323 for (
size_t r=0;r<matrix.getRowCount();r++)
324 for (
size_t c=0;c<matrix.getColCount();c++)
325 matrix.get_unsafe(r,c) =
static_cast<typename MAT::Scalar
>( randomGenerator.drawUniform(unif_min,unif_max) );
333 std::vector<T> &v_out,
334 const T& unif_min = 0,
335 const T& unif_max = 1 )
337 size_t n = v_out.size();
338 for (
size_t r=0;r<n;r++)
339 v_out[r] = randomGenerator.drawUniform(unif_min,unif_max);
349 const double mean = 0,
350 const double std = 1 )
352 for (
size_t r=0;r<matrix.getRowCount();r++)
353 for (
size_t c=0;c<matrix.getColCount();c++)
354 matrix.get_unsafe(r,c) =
static_cast<typename MAT::Scalar
>(
mean +
std*randomGenerator.drawGaussian1D_normalized() );
362 std::vector<T> &v_out,
366 size_t n = v_out.size();
367 for (
size_t r=0;r<n;r++)
368 v_out[r] =
mean +
std*randomGenerator.drawGaussian1D_normalized();
375 randomGenerator.randomize(seed);
378 randomGenerator.randomize();
385 const std::vector<T> &in_vector,
386 std::vector<T> &out_result)
388 randomGenerator.permuteVector(in_vector,out_result);
396 template <
typename T>
399 std::vector<T> &out_result)
401 randomGenerator.drawGaussianMultivariate(out_result,cov);
414 template <
typename T>
417 size_t desiredSamples,
418 std::vector< std::vector<T> > &ret,
419 std::vector<T> *samplesLikelihoods = NULL)
421 randomGenerator.drawGaussianMultivariateMany(ret,desiredSamples,cov,
static_cast<const std::vector<T>*
>(NULL),samplesLikelihoods);
428 template <
typename T,
typename MATRIXLIKE>
430 const MATRIXLIKE &
cov,
431 size_t desiredSamples,
432 std::vector< std::vector<T> > &ret )
434 randomGenerator.drawGaussianMultivariateMany(ret,desiredSamples,cov);
441 template <
typename T,
typename MATRIXLIKE>
443 const MATRIXLIKE &
cov,
444 std::vector<T> &out_result)
446 randomGenerator.drawGaussianMultivariate(out_result,cov);
#define ASSERT_EQUAL_(__A, __B)
double drawUniform(const double Min, const double Max)
Generate a uniformly distributed pseudo-random number using the MT19937 algorithm, scaled to the selected range.
void randomNormalMultiDimensional(const CMatrixTemplateNumeric< T > &cov, std::vector< T > &out_result)
Generate multidimensional random samples according to a given covariance matrix.
void permuteVector(const VEC &in_vector, VEC &out_result)
Returns a random permutation of a vector: all the elements of the input vector are in the output but ...
void drawUniformUnsignedInt(uint32_t &ret_number)
You can call this overloaded method with either 32 or 64bit unsigned ints for the sake of general cod...
BASE_IMPEXP CRandomGenerator randomGenerator
A static instance of a CRandomGenerator class, for use in single-thread applications.
void drawGaussian1DVector(VEC &v, const double mean=0, const double std=1)
Fills the given vector with independent, 1D-normally distributed samples.
void randomNormalMultiDimensionalMany(const CMatrixTemplateNumeric< T > &cov, size_t desiredSamples, std::vector< std::vector< T > > &ret, std::vector< T > *samplesLikelihoods=NULL)
Generate a given number of multidimensional random samples according to a given covariance matrix...
void drawGaussian1DMatrix(MAT &matrix, const double mean=0, const double std=1)
Fills the given matrix with independent, 1D-normally distributed samples.
A thred-safe pseudo random number generator, based on an internal MT19937 randomness generator...
void randomPermutation(const std::vector< T > &in_vector, std::vector< T > &out_result)
Returns a random permutation of a vector: all the elements of the input vector are in the output but ...
void drawUniformUnsignedIntRange(T &ret_number, const U min_val, const V max_val)
Return a uniform unsigned integer in the range [min_val,max_val] (both inclusive) ...
void drawGaussianMultivariateMany(VECTOR_OF_VECTORS &ret, size_t desiredSamples, const COVMATRIX &cov, const typename VECTOR_OF_VECTORS::value_type *mean=NULL)
Generate a given number of multidimensional random samples according to a given covariance matrix...
double drawGaussian1D(const double mean, const double std)
Generate a normally distributed pseudo-random number.
void drawUniformMatrix(MAT &matrix, const double unif_min=0, const double unif_max=1)
Fills the given matrix with independent, uniformly distributed samples.
This base provides a set of functions for maths stuff.
Eigen::Matrix< typename MATRIX::Scalar, MATRIX::ColsAtCompileTime, MATRIX::ColsAtCompileTime > cov(const MATRIX &v)
Computes the covariance matrix from a list of samples in an NxM matrix, where each row is a sample...
Data used internally by the MT19937 PRNG algorithm.
void drawGaussianMultivariate(VECTORLIKE &out_result, const COVMATRIX &cov, const VECTORLIKE *mean=NULL)
Generate multidimensional random samples according to a given covariance matrix.
void Randomize(const uint32_t seed)
Randomize the generators.
void vectorRandomNormal(std::vector< T > &v_out, const T &mean=0, const T &std=1)
Generates a random vector with independent, normally distributed samples.
CRandomGenerator(const uint32_t seed)
Constructor for providing a custom random seed to initialize the PRNG.
ptrdiff_t random_generator_for_STL(ptrdiff_t i)
A random number generator for usage in STL algorithms expecting a function like this (eg...
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
void matrixRandomNormal(MAT &matrix, const double mean=0, const double std=1)
Fills the given matrix with independent, normally distributed samples.
void matrixRandomUni(MAT &matrix, const double unif_min=0, const double unif_max=1)
Fills the given matrix with independent, uniformly distributed samples.
CRandomGenerator()
Default constructor: initialize random seed based on current time.
CONTAINER::value_type element_t
void vectorRandomUni(std::vector< T > &v_out, const T &unif_min=0, const T &unif_max=1)
Fills the given matrix with independent, uniformly distributed samples.
EIGEN_STRONG_INLINE double mean() const
Computes the mean of the entire matrix.
void drawUniformVector(VEC &v, const double unif_min=0, const double unif_max=1)
Fills the given vector with independent, uniformly distributed samples.
void drawUniformUnsignedInt(uint64_t &ret_number)