Boost
arrow_drop_down
Boost.Histogram
M
D

本次发布

Hans Dembinski
Hans Dembinski
作者
Andrey Semashev
Andrey Semashev
贡献者

依赖项

具有便捷接口的多维通用直方图

由 ❤ 编码。由 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® 公司经理

“我想说声‘谢谢’,感谢你们出色的 Histogram 库。我正在开发一个用于处理气象数据的软件包,并借助 Qt 和 QwtPolar 使用它来生成风玫瑰图。看起来你们似乎考虑到了所有方面——圆形轴类型简直就是为此应用而设计的,一切都‘恰到好处’。”

更多信息

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

全部时间

Henry Schreiner
Henry Schreiner
贡献者
sdarwin
sdarwin
贡献者
pb
pb
贡献者
Matt Borland
Matt Borland
贡献者
Glen Fernandes
Glen Fernandes
贡献者
Mateusz Łoskot
Mateusz Łoskot
贡献者
Ed Catmur
Ed Catmur
贡献者
Jay Gohil
Jay Gohil
贡献者
Han Jiang
Han Jiang
贡献者
Ruggero Turra
Ruggero Turra
贡献者
Rene Rivera
Rene Rivera
贡献者
Peter Dimov
Peter Dimov
贡献者
Edward Diener
Edward Diener
贡献者
Thomas Barbier
Thomas Barbier
贡献者
Baoshuo Ren
Baoshuo Ren
贡献者