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

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

生成的矩阵将包含 LOHI 之间范围内双精度类型的伪随机元素。

如果您可以使用 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);