Eigen::unaryExpr 和 const 用于随机数引擎

Eigen::unaryExpr and const for random number engine

本文关键字:随机数 引擎 用于 unaryExpr Eigen const      更新时间:2023-10-16

我有以下类:

class TestRandom
{
    public:
        struct scalar_op
          {
            std::mt19937 rng;                  
            std::normal_distribution<double> norm;  
            scalar_op(){}
            scalar_op(unsigned long seed){rng = std::mt19937(seed);}
            void reset(unsigned long seed=std::mt19937::default_seed){ rng142.seed(seed);norm.reset(); }
            double operator()(void) const
            { 
                    double n_noise =norm(rng);
                    return n_noise;
            }
          };
        TestRandom(){}
        void reset(unsigned long seed=std::mt19937::default_seed){rand.reset(seed);}
        /// Draw nn samples from the gaussian and return them
        Eigen::MatrixXd samples(int n)
        {    
             Eigen::MatrixXd noise(3,n);
             noise.unaryExpr(rand);
             return corr_noise;
        }
    private:
        scalar_op rand; 
}; //TestRandom  

我试图实现的是首先将随机数生成器重置为

TestRandom r1;
 r1.reset(1)

然后用随机样本填充矩阵,如

  Eigen::MatrixXd normal_random = r1.samples(1); // just a sample of random numbers

但是我得到一个编译错误

 error C3848: expression having type 'const std::mt19937' would lose some const-volatile qualifiers in order to call 'unsigned int std::mersenne_twister<_Ty,_Wx,_Nx,_Mx,_Rx,_Px,_Ux,_Sx,_Bx,_Tx,_Cx,_Lx>::operator ()(void)

如果我删除 () 运算符的 const,代码会编译,但 operator() 中的计算不会执行(我可以在调试器中看到这一点)。

指出

我的错误并可能提供解决此问题的方法会非常友善。提前致谢

rng属性

应该声明mutable,例如:

mutable std::mt19937 rng;