使用标准库或增强库从一组数据计算直方图

时间:2018-03-23 21:42:31

标签: c++

我的问题非常简单。我有一个随机值的浮点数组。我想找到数组中出现的值的数量。

例如。

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

3 个答案:

答案 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