特征矩阵库中的setRandom函数用[-1,1]范围内的随机数填充给定矩阵。如何扩展它以在任何给定范围内生成数字?我需要浮点数,我可以使用伪随机数。
我尝试过以下操作:
B = LO + A.cast<double>().array()/(static_cast <double>(RAND_MAX)/(HI-LO));
这里A是有问题的矩阵,[LO,HI]是我想填写它的范围。问题是我的RAND_MAX值是2147483647,这搞乱了整个计算。
非常感谢任何帮助。
答案 0 :(得分:3)
这可能会有所帮助:
#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
之间范围内double类型的伪随机元素。
答案 1 :(得分:1)
如果您可以使用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)
答案 2 :(得分:0)
使用Eigen的无效表达式组合c ++ 11随机数生成器:
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
中,如最后一行所示。
答案 3 :(得分:0)
这种方式如何?
#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;
}
在这里,我将在@davidhigh中使用的 NullaryExpr 替换为 unaryExpr 。原因是我在尝试@davidhigh答案时遇到了一些奇怪的错误。