uBLAS 是一个 C++ 模板类库,为稠密、压缩和稀疏矩阵提供 BLAS 级别 1、2、3 的功能。其设计和实现通过运算符重载统一了数学符号,并通过表达式模板实现了高效的代码生成。
uBLAS 为稠密、单位和稀疏向量,以及稠密、单位、三角、带状、对称、埃尔米特和稀疏矩阵提供了模板化的 C++ 类。可以通过范围、切片、适配器类和间接数组来构建向量和矩阵的视图。该库涵盖了向量和矩阵上常用的基本线性代数运算:如各种范数的约简、向量和矩阵的加减法以及与标量的乘法、向量的内积和外积、矩阵向量和矩阵矩阵的乘法以及三角求解器。容器、视图和表达式模板操作之间的粘合剂主要是符合 STL 的迭代器接口。
uBLAS 最初由 Joerg Walter 和 Mathias Koch 编写。我们要感谢所有支持和贡献该库开发的人员:David Abrahams、Ed Brey、Fernando Cacciola、Juan Jose Gomez Cadenas、Beman Dawes、Matt Davies、Bob Fletcher、Kresimir Fresl、Joachim Kessel、Patrick Kowalzick、Toon Knapen、Hendrik Kueck、John Maddock、Jens Maurer、Alexei Novakov、Gary Powell、Joachim Pyras、Peter Schmitteckert、Jeremy Siek、Markus Steffl、Michael Stevens、Benedikt Weber、Martin Weiser、Gunter Winkler、Marc Zimmermann、Marco Guazzone、Nasos Iliopoulus、Boost 的成员以及世界各地的所有其他贡献者。我保证我会尽力将他们的名字添加到此列表中。
该库目前由 David Bellot 和 Stefan Seefeld 维护。
问:我应该在新项目中使用 uBLAS 吗?
答:在撰写本文时(2012 年 9 月),有许多优秀的矩阵库可用,例如 MTL4、armadillo、eigen。uBLAS 提供了一组稳定、经过良好测试的向量和矩阵类,以及用于线性代数的典型运算和三角方程组求解器。uBLAS 提供稠密、结构化和稀疏矩阵 - 全部使用类似的接口。最后,uBLAS 提供了良好的(但不是出色的)性能。另一方面,uBLAS 的最后一次重大改进是在 2008 年,自 2009 年以来没有提交任何重大更改。因此,人们应该问自己一些问题来帮助做出决定:可用性?uBLAS 是 boost 的一部分,因此在许多环境中都可用。易于使用?uBLAS 对于简单的事情很容易使用,但是当您离开路径时,需要相当多的 C++ 知识。性能?有更快的替代方案。最前沿?uBLAS 已有 10 多年的历史,错过了 C++11 的所有新功能。
问:我正在运行 uBLAS 稠密向量和矩阵基准测试。为什么我看到本机 C 实现和库实现之间存在显着的性能差异?
答:uBLAS 区分调试模式(启用大小和类型一致性检查,禁用表达式模板)和发布模式(禁用大小和类型一致性检查,启用表达式模板)。请检查是否定义了 cassert
的预处理器符号 NDEBUG
。NDEBUG
启用发布模式,该模式反过来使用表达式模板。您可以选择定义 BOOST_UBLAS_NDEBUG
以禁用 uBLAS 的所有边界、结构和类似检查。
问:我编写了一些 uBLAS 测试,这些测试尝试错误地分配不同的矩阵类型或超出向量和矩阵的维度。为什么我没有得到编译时或运行时诊断?
答:uBLAS 区分调试模式(启用大小和类型一致性检查,禁用表达式模板)和发布模式(禁用大小和类型一致性检查,启用表达式模板)。请检查是否定义了 cassert
的预处理器符号 NDEBUG
。NDEBUG
禁用调试模式,这是获取大小和类型一致性检查所必需的。
问:我编写了一些 uBLAS 基准测试来测量矩阵链乘法的性能,例如 prod (A, prod (B, C))
,并且由于使用表达式模板而看到明显的性能损失。如何禁用表达式模板?
答:您不需要禁用表达式模板。请尝试重新引入临时变量,使用 prod (A,
matrix_type
(prod (B, C)))
或 prod (A, prod<
matrix_type
> (B, C))
。
版权 (©) 2000-2011 Joerg Walter、Mathias Koch、Gunter Winkler、David Bellot
使用、修改和分发受 Boost 软件许可版本 1.0 的约束。(请参阅随附文件 LICENSE_1_0.txt 或在 https://boost.ac.cn/LICENSE_1_0.txt 复制)。