特征矩阵库用给定范围内的随机浮点值填充矩阵

时间:2016-03-06 14:16:09

标签: c++ eigen eigen3

特征矩阵库中的setRandom函数用[-1,1]范围内的随机数填充给定矩阵。如何扩展它以在任何给定范围内生成数字?我需要浮点数,我可以使用伪随机数。

我尝试过以下操作:

B = LO + A.cast<double>().array()/(static_cast <double>(RAND_MAX)/(HI-LO));

这里A是有问题的矩阵,[LO,HI]是我想填写它的范围。问题是我的RAND_MAX值是2147483647,这搞乱了整个计算。

非常感谢任何帮助。

4 个答案:

答案 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

结果矩阵将包含LOHI之间范围内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)

生成范围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答案时遇到了一些奇怪的错误。