用给定范围内的随机浮点值填充矩阵的特征矩阵库
Eigen matrix library filling a matrix with random float values in a given range
Eigen矩阵库中的setRandom函数用[-1,1]范围内的随机数填充给定矩阵。我如何扩展它以生成任何给定范围内的数字?我需要浮点数,我接受伪随机数。
我已尝试执行以下操作:
B = LO + A.cast<double>().array()/(static_cast <double>(RAND_MAX)/(HI-LO));
这里 A 是有问题的矩阵,[LO,HI] 是我要填充的范围。问题是 RAND_MAX 的值对我来说是 2147483647,这搞砸了整个计算。
非常感谢任何帮助。
这可能有帮助:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
double HI = 12345.67; // set HI and LO according to your problem.
double LO = 879.01;
double range= HI-LO;
MatrixXd m = MatrixXd::Random(3,3); // 3x3 Matrix filled with random numbers between (-1,1)
m = (m + MatrixXd::Constant(3,3,1.))*range/2.; // add 1 to the matrix to have values between 0 and 2; multiply with range/2
m = (m + MatrixXd::Constant(3,3,LO)); //set LO as the lower bound (offset)
cout << "m =\n" << m << endl;
}
输出:
m =
10513.2 10034.5 4722.9
5401.26 11332.6 9688.04
9858.54 3144.26 4064.16
生成的矩阵将包含 LO
和 HI
之间范围内双精度类型的伪随机元素。
如果您可以使用 C++ 11/14,则以下内容有效。
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);
double number = distribution(generator)
这将为 distribution(L,R)
生成范围 L 和 R 之间的随机浮点值
将 c++11 随机数生成器与 Eigen 的空表达式相结合:
std::random_device rd;
std::mt19937 gen(rd()); //here you could also set a seed
std::uniform_real_distribution<double> dis(LO, HI);
//generate a 3x3 matrix expression
Eigen::MatrixXd::NullaryExpr random_matrix(3,3,[&](){return dis(gen);});
//store the random_number in a matrix M
Eigen::MatrixXd M = random_matrix;
请注意,每次调用 random_matrix(0,0)
时都会获得一个新的随机数。这对于只访问一次元素的矩阵运算是可以的。如果您需要一个在多个地方使用的随机矩阵,您可以将其保存为特征矩阵 M
,如最后一行所示。
这样怎么样?
#include<iostream>
#include<random>
#include <Eigen/Dense>
int main(){
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<float> dis(0, 1);
Eigen::MatrixXf m = Eigen::MatrixXf::Zero(10,10).unaryExpr([&](float dummy){return dis(gen);});
cout<<"Uniform random matrix:\n"<<m<<endl;
cout<<"Mean: "<<m.mean()<<endl;
return 0;
}
这里我用unaryExpr替换了@davidhigh中使用的NullaryExpr。原因是我在尝试@davidhigh 回答时遇到了一些奇怪的错误。
编辑:基于@arprice
#if EIGEN_VERSION_AT_LEAST(3, 3, 0)
auto rand_fn = [&](){return uni(gen);};
#else
auto rand_fn = [&](float){return uni(gen);};
#endif Eigen::Vector3d::NullaryExpr(rand_fn);
Eigen矩阵库中的setRandom函数用[-1,1]范围内的随机数填充给定矩阵。我如何扩展它以生成任何给定范围内的数字?我需要浮点数,我接受伪随机数。
我已尝试执行以下操作:
B = LO + A.cast<double>().array()/(static_cast <double>(RAND_MAX)/(HI-LO));
这里 A 是有问题的矩阵,[LO,HI] 是我要填充的范围。问题是 RAND_MAX 的值对我来说是 2147483647,这搞砸了整个计算。
非常感谢任何帮助。
这可能有帮助:
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
using namespace std;
int main()
{
double HI = 12345.67; // set HI and LO according to your problem.
double LO = 879.01;
double range= HI-LO;
MatrixXd m = MatrixXd::Random(3,3); // 3x3 Matrix filled with random numbers between (-1,1)
m = (m + MatrixXd::Constant(3,3,1.))*range/2.; // add 1 to the matrix to have values between 0 and 2; multiply with range/2
m = (m + MatrixXd::Constant(3,3,LO)); //set LO as the lower bound (offset)
cout << "m =\n" << m << endl;
}
输出:
m =
10513.2 10034.5 4722.9
5401.26 11332.6 9688.04
9858.54 3144.26 4064.16
生成的矩阵将包含 LO
和 HI
之间范围内双精度类型的伪随机元素。
如果您可以使用 C++ 11/14,则以下内容有效。
#include <random>
std::default_random_engine generator;
std::uniform_real_distribution<double> distribution(0.0,1.0);
double number = distribution(generator)
这将为 distribution(L,R)
将 c++11 随机数生成器与 Eigen 的空表达式相结合:
std::random_device rd;
std::mt19937 gen(rd()); //here you could also set a seed
std::uniform_real_distribution<double> dis(LO, HI);
//generate a 3x3 matrix expression
Eigen::MatrixXd::NullaryExpr random_matrix(3,3,[&](){return dis(gen);});
//store the random_number in a matrix M
Eigen::MatrixXd M = random_matrix;
请注意,每次调用 random_matrix(0,0)
时都会获得一个新的随机数。这对于只访问一次元素的矩阵运算是可以的。如果您需要一个在多个地方使用的随机矩阵,您可以将其保存为特征矩阵 M
,如最后一行所示。
这样怎么样?
#include<iostream>
#include<random>
#include <Eigen/Dense>
int main(){
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<float> dis(0, 1);
Eigen::MatrixXf m = Eigen::MatrixXf::Zero(10,10).unaryExpr([&](float dummy){return dis(gen);});
cout<<"Uniform random matrix:\n"<<m<<endl;
cout<<"Mean: "<<m.mean()<<endl;
return 0;
}
这里我用unaryExpr替换了@davidhigh中使用的NullaryExpr。原因是我在尝试@davidhigh 回答时遇到了一些奇怪的错误。
编辑:基于@arprice
#if EIGEN_VERSION_AT_LEAST(3, 3, 0)
auto rand_fn = [&](){return uni(gen);};
#else
auto rand_fn = [&](float){return uni(gen);};
#endif Eigen::Vector3d::NullaryExpr(rand_fn);