Installation
You can install EigenRand by just downloading the source codes from the repository. Since EigenRand is a header-only library like Eigen, none of binaries needs to be installed. All you need is Eigen 3.3.4 ~ 3.4.0 and C++11 compiler.
Simple Random Matrix Generators
#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
using namespace Eigen;
int main()
{
MatrixXf mat = Rand::balanced<MatrixXf>(4, 4, urng);
std::cout << mat << std::endl;
ArrayXXf arr = Rand::normal<ArrayXXf>(10, 10, urng);
std::cout << arr << std::endl;
return 0;
}
P8_mt19937< uint64_t > P8_mt19937_64
a vectorized mt19937_64 which generates 8 integers of 64bit simultaneously. It always yields the same...
Definition: PacketRandomEngine.h:607
Random Matrix Functions with suffix '-Like'
Basically, in order to call each random distribution function of EigenRand, template parameters must be passed following the dense matrix or array type to be created. But, if you have an instance of Eigen::Matrix or Eigen::Array already, you can use -Like function to generate a random matrix or array with the same type and shape.
#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
using namespace Eigen;
int main()
{
MatrixXf mat{ 10, 10 };
Rand::balancedLike(mat, urng);
mat = Rand::balancedLike(mat, urng);
std::cout << mat << std::endl;
return 0;
}
Every random distribution function has its corresponding -Like function.
Vectorization over Parameters
EigenRand's random number generators typically accept scalar parameters. However, certain generators can generate random numbers efficiently for an array of parameters in an element-wise manner. You can see the full list of distributions which support the vectorization over parameters at list_of_supported_distribution.
#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
using namespace Eigen;
int main()
{
ArrayXf a{ 10 }, b{ 10 }, c{ 10 };
a << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
b << 10, 12, 14, 16, 18, 20, 22, 24, 26, 28;
c = Rand::uniformReal(urng, a, b);
std::cout << c << std::endl;
c = Rand::uniformReal(urng, -5, b);
std::cout << c << std::endl;
c = Rand::uniformReal(urng, a, 11);
std::cout << c << std::endl;
return 0;
}
Efficient Reusable Generator
In the example above, functions, such as Eigen::Rand::balancedLike
, Eigen::Rand::normal
and so on, creates a generator internally each time to be called. If you want to generate random matrices from the same distribution, consider using Generator classes as following:
#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
using namespace Eigen;
int main()
{
MatrixXf mat = norm_gen.template generate<MatrixXf>(10, 10, urng);
std::cout << mat << std::endl;
mat = norm_gen.generateLike(mat, urng);
std::cout << mat << std::endl;
return 0;
}
Generator of reals on a normal distribution.
Definition: NormalExp.h:92
Drawing samples from Multivariate Distribution
EigenRand provides generators for some multivariate distributions.
#include <iostream>
#include <Eigen/Dense>
#include <EigenRand/EigenRand>
using namespace Eigen;
int main()
{
Vector4f mean{ 0, 1, 2, 3 };
Matrix4f cov;
cov << 1, 1, 0, 0,
1, 2, 0, 0,
0, 0, 3, 1,
0, 0, 1, 2;
{
auto gen2 = Rand::makeMvNormalGen(mean, cov);
Vector4f sample = gen1.generate(urng);
Matrix<float, 4, -1> samples = gen1.generate(urng, 10);
}
{
auto gen3 = Rand::makeWishartGen(4, cov);
Matrix4f sample = gen3.generate(urng);
Matrix<float, 4, -1> samples = gen3.generate(urng, 10);
}
return 0;
}
Generator of real vectors on a multivariate normal distribution.
Definition: MvNormal.h:58