我的问题非常简单。我有一个随机值的浮点数组。我想找到数组中出现的值的数量。
例如。
float data[] = {1.1,1.1,1.1,
2.1,2.1,2.1,
3.1,3.1,3.1,
4.1,4.1,4.1,
5.1,5.1,5.1,
1.5,1.5,1.5,
3.2,3.2,3.2};
标准库或升级库中是否存在某种范围直方图函数,它将返回值的出现次数。在上面的例子中,
0-1 -> 0 times
1-2 -> 6 times
2-3 -> 3 times
3-4 -> 6 times
4-5 -> 3 times
答案 0 :(得分:1)
您正在寻找能够随心所欲的std::map
:
std::vector<double> data = {1.1,1.1,1.1,
2.1,2.1,2.1,
3.1,3.1,3.1,
4.1,4.1,4.1,
5.1,5.1,5.1,
1.5,1.5,1.5,
3.2,3.2,3.2};
std::map<int,int> histogram;
for (const auto& e : data) ++histogram[e];
for (const auto& x : histogram) std::cout << x.first << " " << x.second <<"\n";
打印:
1 6
2 3
3 6
4 3
5 3
我允许自己使用vector
代替c-array。映射存储键值对,其operator[]
返回对给定键值的引用(如果还没有,则默认构造它)。
答案 1 :(得分:0)
如何使用count。这个可行的解决方案:
int count(std::vector<float> &data, const float lower, const float upper) {
return std::count_if(data.begin(), data.end(),[&lower, &upper](float i){return i>lower && i<upper;});
}
答案 2 :(得分:0)
要补充已接受的答案,还可以对任意间隔计算直方图,只要您对数据数组进行排序即可。
std::vector<double> data = {1.1,1.1,1.1,
2.1,2.1,2.1,
3.1,3.1,3.1,
4.1,4.1,4.1,
5.1,5.1,5.1,
1.5,1.5,1.5,
3.2,3.2,3.2};
std::sort(data.begin(), data.end());
std::map<double, int> histogram;
double bin = 0; //Choose your starting bin
const double bin_width = 1.5; //Choose your bin interval
for (const auto& e : data)
{
e >= bin + bin_width ? bin += bin_width : false;
++histogram[bin];
}
for (const auto& x : histogram)
{
std::printf("[%.2f,%.2f[ : %d\n", x.first, x.first + bin_width, x.second);
}
打印:
[0.00,1.50[ : 3
[1.50,3.00[ : 6
[3.00,4.50[ : 9
[4.50,6.00[ : 3