Eigen :: unaryExpr和随机数引擎的const

时间:2016-03-16 18:39:39

标签: c++ random operators eigen functor

我有以下课程:

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()内的计算(我可以在调试器中看到这一点)。

指出我的错误并且可能提供解决方法的方法会非常有点。提前致谢

1 个答案:

答案 0 :(得分:0)

rng attribut应声明为mutable,例如:

mutable std::mt19937 rng;