加入高斯噪声
Adding Gaussian noise
我有一个包含浮点数列表的.arff
文件。我需要为每个数字添加高斯噪声,在MATLAB中为:
m = m+k*randn(size(m)
,其中m
是列表中的数字之一,k
是标准差,其值为0.1
。C++
和randn()
的等价值是多少?
你能举个例子吗?
使用std::normal_distribution
和适当的生成器(std::default_random_engine
通常可以工作)。有关c++标准库中所有随机数生成工具的详细信息,请参阅http://en.cppreference.com/w/cpp/numeric/random。
(生活)
#include <iostream>
#include <iterator>
#include <random>
int main() {
// Example data
std::vector<double> data = {1., 2., 3., 4., 5., 6.};
// Define random generator with Gaussian distribution
const double mean = 0.0;
const double stddev = 0.1;
std::default_random_engine generator;
std::normal_distribution<double> dist(mean, stddev);
// Add Gaussian noise
for (auto& x : data) {
x = x + dist(generator);
}
// Output the result, for demonstration purposes
std::copy(begin(data), end(data), std::ostream_iterator<double>(std::cout, " "));
std::cout << "n";
return 0;
}
输出:0.987803 1.89132 3.06843 3.89248 5.00333 6.07448
进一步考虑
对于合适的统计属性,您可能希望选择std::mersenne_twister_engine
生成器(或者,为了方便,使用std::mt19937
预定义版本),并使用std::random_device
:
std::mt19937 generator(std::random_device{}());
[注意:从std::random_device
播种是进入的好做法;如果你使用当前时间作为种子,你最终可以在多个生成器中使用相同的种子值(例如,在很短的时间内初始化几个生成器)。std::random_device
将从系统中获得熵,如果可用。]
为了避免每次都将生成器传递给分发版,您可以这样做:
auto dist = std::bind(std::normal_distribution<double>{mean, stddev},
std::mt19937(std::random_device{}()));
,你可以这样使用:
double val = dist();
(带有这些修改的实例)
c++标准现在包含了几个随机数的分布。
你正在寻找std::normal_distribution。
在文档中你也可以找到一个代码示例
// construct a trivial random generator engine from a time-based seed:
unsigned seed = std::chrono::system_clock::now().time_since_epoch().count();
std::default_random_engine generator (seed);
std::normal_distribution<double> distribution (0.0,1.0);
std::cout << "some Normal-distributed(0.0,1.0) results:" << std::endl;
for (int i=0; i<10; ++i)
std::cout << distribution(generator) << std::endl;
给构造函数std::normal_distribution的参数首先是均值(0.0)和标准差(1.0)。
相关文章:
- 在C++上实现高斯赛德尔迭代方法
- C++:矩阵高斯消除不起作用:使用单维数组来存储元素
- (C++)(Visual Studio) 将高斯模糊滤镜应用于 RGB 中的灰度图像
- 用于创建高斯随机数的 c++ 函数
- 将高斯模糊应用于灰度图像
- 高斯雅各比法
- 用高斯Seidel红色黑色求解1D泊松方程
- 如何改变高斯分布(提升)中的种子
- 并行化高斯模糊链
- 为什么在 C++ 中实现高斯勒让德算法没有产生结果
- 生成高斯噪声
- 部分透视/高斯消除 - 交换列而不是产生错误输出的行
- 使用高斯模糊进行图像卷积,可以加速
- 如何使用 1D 高斯内核在 Filter2D 上创建自定义 2D 内核
- ***检测到堆栈粉碎***:在高斯消除中
- 使用C 加入高斯噪声
- 高斯滤波器核值
- 用于高斯过程的准随机数生成器
- 加入高斯噪声
- 使用Qt添加高斯白噪声