我有一个很大的向量,我想添加具有正态分布的噪声。 我现在在做什么对于循环来说是微不足道的:

for (int i=0 ; i<size ; i++){    //size is of order 1000000
    boost::mt19937 gen;
    gen.seed(i);
    boost::normal_distribution<>  nd(0.0 , 1.0);
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<> >
                                                         randNormal (gen,nd);

    noise = randNormal();  
    nsyData[i] = data[i] + sd*noise; 
    }

有一种有效的方法可以做到这一点吗? 像MATLAB一样吗?

===============>>#1 票数:4 已采纳

这是我的看法:

#include <boost/random/normal_distribution.hpp>
#include <boost/random.hpp>

int main()
{
    boost::mt19937 gen(42); // seed it once
    boost::normal_distribution<double> nd(0.0, 1.0);
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > randNormal(gen, nd);

    std::vector<double> data(100000, 0.0), nsyData;
    nsyData.reserve(data.size());

    double sd = 415*randNormal();
    std::transform(data.begin(), data.end(), std::back_inserter(nsyData), 
            [sd,&randNormal](double data) { return data + sd*randNormal(); });

}

请注意,您在循环的每次迭代中都播种了mersenne扭曲器。 恐怕这完全破坏了所生成随机数的任何质量保证。 播种一次发电机。 (显然,如果需要不确定的种子,请使用其他种子,例如,使用random_device的种子)。

看到这个Live on Coliru

更新在评论中来回反复后,这是一个c ++ 03版本,虽然仍然可以理解,但实际上应该不会太糟糕:

#include <boost/random/normal_distribution.hpp>
#include <boost/random.hpp>
#include <boost/bind.hpp>

struct Xfrm { 
    typedef double result_type;

    template <typename Gen>
    double operator()(double sd, Gen& randNormal, double data) const {
        return data + sd*randNormal();
    }
};

int main()
{
    boost::mt19937 gen(42); // seed it once
    boost::normal_distribution<double> nd(0.0, 1.0);
    boost::variate_generator<boost::mt19937&, boost::normal_distribution<double> > randNormal(gen, nd);

    std::vector<double> data(100000, 0.0), nsyData;
    nsyData.reserve(data.size());

    double sd = 415*randNormal();

    std::transform(data.begin(), data.end(), std::back_inserter(nsyData), 
            boost::bind(Xfrm(), sd, boost::ref(randNormal), ::_1));
}

  ask by sali translate from so

未解决问题?本站智能推荐:

1回复

C ++中具有正常噪声的信号的扰动

我如何用高斯噪声干扰信号,例如正弦(x)? 我需要这样的东西:
1回复

如何使用Boost Multiprecision生成普通随机数?

我正在尝试使用boost的多精度从正态分布生成随机数。 我可以从均匀分布中生成随机数,但是当我尝试从标准正态生成时,它会报告错误。 这是代码: (以下示例来自boost ,将mpz_int更改为cpp_int,将mpf_float_50更改为cpp_dec_float_50)
1回复

使用Boost从多元正态分布中抽取样本

我可以使用c ++中的Boost从正态分布中采样。 我现在有一个简单的问题: 如何使用Boost函数(正态分布,多数组...)从多元正态分布(n> 2)中采样?
2回复

如何使用升压正态分布类?

我正在尝试使用boost :: normal_distribution来生成均值为0和sigma 1的正态分布。 以下代码无效,因为某些值超过或超过-1和1(并且不应)。 有人能指出我做错了什么吗? 我的机器上的结果是: 如您所见,所有值都不在-1和1之间。 谢谢大
1回复

多个对象中的C ++ Boost正常随机数

抱歉,这很愚蠢。 我是Boost的新手,很长一段时间没有使用C ++。 这是一个玩具问题,试图重新使用。 假设我有n台老虎机,每次运行都会支付R。 R需要正态分布。 每台机器的均值和方差需要不同。 我当前的C ++ 11代码如下所示: narm.h: narm.cp
1回复

如何计算C ++中正态分布的CDF概率?

在给定平均值和sigma的情况下,是否有任何函数可以让我计算正态分布的CDF概率? 即,例如P(X <x)给出正常分布与$ \\ bar {x} $和$ \\ sigma $。 我认为提升有这个,但我认为这只是标准的正态分布。
1回复

如何在类中编写有效的正态分布

我在相同的情况下运行我的项目(即当然除了随机数)。 有时候实验运行顺利,有时则没有。 我怀疑随机生成器的实现方式。 这是我使用标准STL的解决方案 我也尝试过boost,一般来说,响应比我使用STL的方法更好,这就是代码。 我的第一个问题是我的方法有什么问题吗? 如果是这
1回复

2D正态分布C ++

因此,我的数学知识仅限于3岁的高中文凭,因此我想这个问题之前已经回答过,但是我无法理解。 我被要求采用我们公司使用的一种算法,该算法以前在一个圆内生成均匀分布的2d点,而其中一个从中心点生成在正态分布内的点。 以前,我一直使用这种方法来计算点的均匀分布时点的x和y值,其中boost是
2回复

Boost BCP不输出任何文件?

我正在尝试使用Boost Copy(BCP)实用程序将normal_distribution类拉出Boost。 但是,当我执行bcp normal_distribution ./my_normal_distribution_dir ,my_normal_distribution_dir目录中不
1回复

在C ++中实现多元正态pdf进行图像分类

我正在寻找在C ++中实现多元普通PDF [ 1 ],以在类的图像成员资格中分配每个像素,即 有没有一个图书馆可以有效地做到这一点(即类似于Matlab的mvnpdf函数[ 2 ])? 如果没有任何想法,哪种库或方法将是最好的(我正在考虑使用Eigen)。