jac*_*ack 1 c++ opencv non-uniform-distribution c++11
我需要您的帮助来解决以下问题:
c ++ / opencv中是否有一个等效于以下代码的函数:
np.random.choice(len(vec), samples, p=probabilities[:,0], replace=True)
Run Code Online (Sandbox Code Playgroud)
提前致谢。
似乎您正在寻找从离散随机分布中采样
该页面上的示例相当具有说明性:
// discrete_distribution
#include <iostream>
#include <random>
int main()
{
const int nrolls = 10000; // number of experiments
const int nstars = 100; // maximum number of stars to distribute
std::default_random_engine generator;
std::discrete_distribution<int> distribution {2,2,1,1,2,2,1,1,2,2};
int p[10]={};
for (int i=0; i<nrolls; ++i) {
int number = distribution(generator);
++p[number];
}
std::cout << "a discrete_distribution:" << std::endl;
for (int i=0; i<10; ++i)
std::cout << i << ": " << std::string(p[i]*nstars/nrolls,'*') << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
好吧,让我们看看:
numpy.random.choice(a, size=None, replace=True, p=None)
Run Code Online (Sandbox Code Playgroud)
->看我的评论,我猜你把函数的一些参数弄混了。
对于输入,a您正在使用样本数组。作为所需的输出大小len(vec),您需要进行替换采样并具有自定义的非均匀分布。
首先使用随机分布生成索引数组,然后使用索引数组生成选定元素的数组可能就足够了。
C ++为生成非均匀分布的数字提供了帮助, std::discrete_distribution
例:
#include <random>
#include <vector>
#include <algorithm>
using std::vector;
int main()
{
const int outputSize = 10;
vector<double> vec(outputSize);
const vector<double> samples{ 1, 2, 3, 4, 5, 6, 7 };
const vector<double> probabilities{ 0.1, 0.2, 0.1, 0.5, 0,1 };
std::default_random_engine generator;
std::discrete_distribution<int> distribution(probabilities.begin(), probabilities.end());
vector<int> indices(vec.size());
std::generate(indices.begin(), indices.end(), [&generator, &distribution]() { return distribution(generator); });
std::transform(indices.begin(), indices.end(), vec.begin(), [&samples](int index) { return samples[index]; });
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:链接似乎表明,std::default_random_engine执行采样与更换。
| 归档时间: |
|
| 查看次数: |
2016 次 |
| 最近记录: |