首页 > 其他 > 详细

cartographer_common_histogram

时间:2020-03-07 19:25:11      阅读:102      评论:0      收藏:0      [点我收藏+]

class Histogram 数据直方图统计函数

作用:统计所有数据中不同区间数据的个数

  • 函数:

    • 默认构造
  • add(float value) :添加数据
    • ToString(int buckets) :输出统计结果
  • buckets 输入,表示统计数据分成的区间数量

  • 参数:
    • values_; 待统计数据集合

carto 代码引用说明:

Histogram —> score_histogram_( 在 constraint_builder_2d.h Histogram of scan matcher scores.统计 评分激光地图匹配评分结果)


为了更好理解代码,简单改了下类中函数,添加了打印,形成histogram_test.cc 可以直接编译运行。

histogram_test.cc

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <math.h>

using namespace std;

std::string toString2f(float a)
{
    char buffer[10];
    sprintf(buffer, "%.2f", a);
    std::string str = buffer;
    return str;
} 

class Histogram {
 public:
  void Add(float value);
  std::string ToString(int buckets) const;

 private:
  std::vector<float> values_;
};

void Histogram::Add(const float value)
{
    cout << " add: " << value;
    values_.push_back(value); 
}   

std::string Histogram::ToString(int buckets) const
{
  cout << endl;
  if (values_.empty()) {
    return "Count: 0";
  }
   float min = *std::min_element(values_.begin(), values_.end());
   float max = *std::max_element(values_.begin(), values_.end());


/*  std::string result = absl::StrCat("Count: ", values_.size(), "  Min: ", min,
                                    "  Max: ", max, "  Mean: ", mean);*/
  std::string result = "result: " ; 
  int values_size = values_.size();
  result +="count: " + to_string(values_size);
  result +="  Min: " + toString2f(min);
  result +="  Max: " + toString2f(max);

  if (min == max) {
    return result;
  }

  float lower_bound = min;
  int total_count = 0;
  for (int i = 0; i != buckets; ++i) {
    const float upper_bound =
        (i + 1 == buckets)
            ? max
            : (max * (i + 1) / buckets + min * (buckets - i - 1) / buckets);
    int count = 0;
    for (const float value : values_) {
      if (lower_bound <= value &&
          (i + 1 == buckets ? value <= upper_bound : value < upper_bound)) {
        ++count;
      }
    }
    total_count += count;
    result += "\n[" + toString2f(lower_bound) + "," + toString2f(upper_bound);
    result += i + 1 == buckets ? ']' : ')';

/*    absl::StrAppendFormat(&result, "\n[%f, %f%c", lower_bound, upper_bound,
                          i + 1 == buckets ? ']' : ')');*/

    constexpr int kMaxBarChars = 20;
    const int bar =
        (count * kMaxBarChars + values_.size() / 2) / values_.size();
    result += "\t";
    for (int i = 0; i != kMaxBarChars; ++i) {
      result += (i < (kMaxBarChars - bar)) ? " " : "#";
    }
    result += "\tCount: "+ to_string(count) + " (" + 
            toString2f(count * 1e2f / values_.size()) + "%)" 
            + "\tTotal: " + to_string(total_count) + " ("
            + toString2f(total_count * 1e2f / values_.size()) + "%)";

/*    absl::StrAppend(&result, "\tCount: ", count, " (",
                    count * 1e2f / values_.size(), "%)",
                    "\tTotal: ", total_count, " (",
                    total_count * 1e2f / values_.size(), "%)");*/
    lower_bound = upper_bound;
  }
  return result;
}

int main()
{
    Histogram h;
    h.Add(1);h.Add(3);h.Add(6);
    h.Add(3);h.Add(3);h.Add(8);
    h.Add(4);h.Add(7);h.Add(9);
    h.Add(2);h.Add(6);h.Add(5);
    h.Add(3);h.Add(5);h.Add(7);
    cout << h.ToString(3);
}

输出结果:

 add: 1 add: 3 add: 6 add: 3 add: 3 add: 8 add: 4 add: 7 add: 9 add: 2 add: 6 add: 5 add: 3 add: 5 add: 7
result: count: 15  Min: 1.00  Max: 9.00
[1.00,3.67)             ########    Count: 6 (40.00%)   Total: 6 (40.00%)
[3.67,6.33)              #######    Count: 5 (33.33%)   Total: 11 (73.33%)
[6.33,9.00]                #####    Count: 4 (26.67%)   Total: 15 (100.00%)[Finished in 0.6s]

cartographer_common_histogram

原文:https://www.cnblogs.com/heimazaifei/p/12435855.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!