MatrixXf :: Random总是返回相同的矩阵

时间:2014-01-22 20:07:06

标签: matrix eigen

我刚刚和Eigen玩了一下,注意到MatrixXf :: Random(3,3)总是返回相同的矩阵,第一个总是以此为例:
 0.680375 0.59688 -0.329554
-0.211234 0.823295 0.536459
 0.566198 -0.604897 -0.444451

这是预期的行为,还是我只是监督一些非常简单的事情? (我对数学库的经验接近于零)

我使用的代码:

for(int i = 0; i < 5; i++) {
        MatrixXf A = MatrixXf::Random(3, 3);
        cout << A <<endl;
}

4 个答案:

答案 0 :(得分:14)

是的,这是预期的行为。 Matrix :: Random使用标准库的随机数生成器,因此您可以使用srand(unsigned int seed)初始化随机数序​​列,例如:

srand((unsigned int) time(0));

答案 1 :(得分:3)

@orian:

std :: srand(无符号种子)不是特征函数。完整的代码应该是这样的:

    std::srand((unsigned int) time(0));
    for(int i = 0; i < 5; i++) {   
            MatrixXf A = MatrixXf::Random(3, 3);
            cout << A <<endl;
        }

答案 2 :(得分:3)

除了srand之外,您还可以将空表达式与现代C ++ 11随机数生成一起使用:

//see https://en.cppreference.com/w/cpp/numeric/random/uniform_real_distribution
std::random_device rd;
std::mt19937 gen(rd());  //here you could set the seed, but std::random_device already does that
std::uniform_real_distribution<float> dis(-1.0, 1.0);

Eigen::MatrixXf A = Eigen::MatrixXf::NullaryExpr(3,3,[&](){return dis(gen);});

这还允许使用更复杂的分布,例如正态分布。

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