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 复制)。