Boost
arrow_drop_down
Boost.Histogram
M
D

本次发布

Hans Dembinski
Hans Dembinski
作者
Matt Borland
Matt Borland
贡献者 - 新
Rene Rivera
Rene Rivera
贡献者 - 新
Thomas Barbier
Thomas Barbier
贡献者 - 新
Ed Catmur
Ed Catmur
贡献者 - 新
Ruggero Turra
Ruggero Turra
贡献者 - 新
sdarwin
sdarwin
贡献者

依赖项

具有便捷界面的多维通用直方图

用 ❤ 编码。由 Boost 社区Scikit-HEP 项目 提供支持。

License

根据 Boost Software License, Version 1.0 分发。

属性

支持的编译器版本 gcc >= 5.5, clang >= 3.8, msvc >= 14.1 支持的 C++ 版本 14, 17, 20

分支 Linux, OSX, Windows 覆盖率
develop Fast Coveralls
master Fast Coveralls

Boost.Histogram 是一个非常快速、最先进的多维通用 直方图 类,适合初学者和专家。

  • 仅包含头文件
  • 易于使用,易于定制
  • 为性能而设计
  • 仅计数或使用累加器计算均值、最小值、最大值……
  • 支持多线程和受限环境(无堆分配、异常或 RTTI)
  • 开放式、对黑客友好的模块化设计
  • 拥有 官方 Python 绑定

查看 完整文档

💡 Boost.Histogram 是一个成熟的库,100% 的代码行都经过单元测试覆盖,经过性能基准测试,并拥有详尽的文档。如果您仍然发现任何问题或认为文档有欠缺,请通过 提交问题 告知我们。在 Slack 上的 Boost 频道Gitter 上与我们聊天。

代码示例

以下精简示例摘自文档的 入门 部分。请查看文档,了解包含注释和更多示例的完整版本。

示例:创建并填充一个一维直方图(在 Wandbox 上在线尝试)。此示例的核心 编译后生成 53 行汇编代码

#include <boost/histogram.hpp>
#include <boost/format.hpp> // used here for printing
#include <iostream>

int main() {
    using namespace boost::histogram;

    // make 1d histogram with 4 regular bins from 0 to 2
    auto h = make_histogram( axis::regular<>(4, 0.0, 2.0) );

    // push some values into the histogram
    for (auto&& value : { 0.4, 1.1, 0.3, 1.7, 10. })
      h(value);

    // iterate over bins
    for (auto&& x : indexed(h)) {
      std::cout << boost::format("bin %i [ %.1f, %.1f ): %i\n")
        % x.index() % x.bin().lower() % x.bin().upper() % *x;
    }

    std::cout << std::flush;

    /* program output:

    bin 0 [ 0.0, 0.5 ): 2
    bin 1 [ 0.5, 1.0 ): 0
    bin 2 [ 1.0, 1.5 ): 1
    bin 3 [ 1.5, 2.0 ): 1
    */
}

功能

  • 高度可定制的多维直方图
  • 简单、便捷、与 STL 和 Boost 兼容的接口
  • 高动态范围计数器,不会溢出或封顶 [1]
  • 比其他库性能更好(详情请参阅基准测试)
  • 内存使用高效 [1]
  • 手工制作的 C++17 推导指南,用于轴和直方图类型
  • 支持自定义轴类型:定义输入值如何映射到索引
  • 支持溢出/欠溢出箱(可单独禁用以减少内存消耗)
  • 支持根据输入值自动增长的轴 [2]
  • 支持加权增量
  • 支持配置文件以及更通用的,单元格中的用户定义累加器 [3]
  • 支持完全基于堆栈的直方图
  • 支持在不使用异常或 RTTI 的情况下编译 [4]
  • 支持直方图的加、减、乘、除和缩放
  • 支持自定义分配器
  • 支持使用单位进行编程 [5]
  • 可选的序列化,基于 Boost.Serialization

注 1 在标准配置下,如果您不使用加权增量。当单元格计数增长时,计数器的容量会动态增加。当即使是最大的普通整数类型也会溢出时,存储会切换到类似于 Boost.Multiprecision 中的多精度整数,其限制仅为可用内存。

注 2 可以配置一个轴,使其在遇到超出其范围的值时增长。然后,它会生成新的箱以朝向该值增长,以便该值落在新的最高或最低箱中。

注 3 可以将直方图配置为在每个单元格中存储任意累加器,而不是简单的计数器。可以向直方图传递额外的值,例如,以计算落在同一单元格中的值的平均值和方差。此功能可用于计算每个单元格的方差估计,当您需要将统计模型拟合到单元格值时非常有用。

注 4 当启用异常时,库会抛出异常。当禁用异常时,在抛出异常时会调用用户定义的异常处理程序,程序会终止,有关详细信息,请参阅 boost::throw_exception。禁用异常会在基准测试中将性能提高 10% 到 20%。该库不使用 RTTI(仅使用 CTTI),因此禁用它没有影响。

注 5 内置轴类型可以配置为仅接受维度数量,例如来自 Boost.Units 的那些。这意味着如果您不小心尝试将一个长度填充到直方图轴期望的时间中,您将得到一个有用的错误。

基准测试

Boost.Histogram 比其他 C/C++ 库更灵活、速度更快。它与以下库进行了比较:

基准测试的详细信息可在 文档 中找到。

用户怎么说

John Buonagurio | Exponent® 公司经理

"我只是想感谢你们的精彩直方图库。我正在开发一个处理气象数据的软件包,我正在使用它在 Qt 和 QwtPolar 的帮助下生成风玫瑰图。看起来你们几乎考虑到了所有事情——圆形轴类型几乎是为这个应用程序设计的,一切都很顺利。"

更多信息

  • 提问
  • 报告错误:请务必提及您正在使用的 Boost 版本、平台和编译器。一个能够重现问题的小型可编译代码示例总是很有用的。
  • 将您的补丁作为拉取请求提交到 **develop** 分支。请注意,通过提交补丁,您同意根据 Boost 软件许可证,版本 1.0 许可您的修改。
  • 关于该库的讨论在 Boost 开发者邮件列表 上进行。在发帖之前,请务必阅读 讨论策略,并在主题行的开头添加 [template] 标签。

全部时间

Henry Schreiner
Henry Schreiner
贡献者
pb
pb
贡献者
Andrey Semashev
Andrey Semashev
贡献者
Glen Fernandes
Glen Fernandes
贡献者
Mateusz Łoskot
Mateusz Łoskot
贡献者
Jay Gohil
Jay Gohil
贡献者
Han Jiang
Han Jiang
贡献者
Edward Diener
Edward Diener
贡献者
Peter Dimov
Peter Dimov
贡献者
Baoshuo Ren
Baoshuo Ren
贡献者