本次发布
依赖项
具有便捷接口的多维通用直方图
由 ❤ 编码。由 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 | ||
| master |
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]标签。