似乎许多项目慢慢地发现需要做矩阵数学,并陷入了首先构建一些向量类,然后慢慢添加功能的陷阱,直到他们被发现构建了一个半成品的自定义线性代数库,并依赖于它。

我想避免这种情况,同时不依赖于一些切线相关的库(例如OpenCV, OpenSceneGraph)。

有哪些常用的矩阵数学/线性代数库,为什么决定使用一个而不是另一个?有没有因为某些原因而被建议不要使用的?我特别在几何/时间上下文中使用这个*(2,3,4 Dim)*,但将来可能会使用更高维度的数据。

我正在寻找关于以下任何方面的差异:API、速度、内存使用、广度/完整性、狭窄性/特异性、可扩展性和/或成熟度/稳定性。

更新

我最终使用了我非常满意的Eigen3。


当前回答

不管怎样,艾根和犰狳我都试过了。下面是一个简短的评价。

特征 优点: 1. 完全独立-不依赖于外部BLAS或LAPACK。 2. 良好的文档。 3.据说很快,不过我还没测试过。

劣势: QR算法只返回一个矩阵,R矩阵嵌入在上面的三角形中。不知道矩阵的其余部分从何而来,也不知道Q矩阵可以被访问。

犰狳 优点: 1. 广泛的分解和其他功能(包括QR)。 2. 相当快(使用表达式模板),但同样,我没有真正将它推到高维。

缺点: 1. 依赖于外部BLAS和/或LAPACK进行矩阵分解。 2. 恕我直言,缺少文档(包括wrt LAPACK的细节,除了更改#define语句)。

如果有一个开放源码库,它是自包含的,并且易于使用,那就太好了。我已经遇到同样的问题10年了,这很令人沮丧。有一次,我使用GSL来编写C语言,并围绕它编写c++包装器,但是使用现代c++——特别是使用表达式模板的优点——我们不应该在21世纪搞乱C语言。只有我的两便士。

其他回答

我听说过Eigen和NT2的优点,但我个人还没有使用过它们。还有Boost。UBLAS,我认为它已经太老了。NT2的开发人员正在构建下一个版本,目的是将其纳入Boost,所以这可能是有意义的。

我林。alg。需求不会超出4x4矩阵的情况下,所以我不能评论高级功能;我只是指出一些选择。

如果你正在寻找英特尔处理器上的高性能矩阵/线性代数/优化,我会看看英特尔的MKL库。

MKL为快速运行时性能进行了精心优化——大部分基于非常成熟的BLAS/LAPACK fortran标准。它的性能随可用内核的数量而变化。具有可用内核的免提可伸缩性是计算的未来,对于不支持多核处理器的新项目,我不会使用任何数学库。

简单地说,它包括:

基本向量-向量,向量-矩阵, 矩阵-矩阵运算 矩阵分解(LU分解,厄米化,稀疏化) 最小二乘拟合和特征值问题 稀疏线性系统求解器 非线性最小二乘求解器(信赖域) 加上信号处理程序,如FFT和卷积 非常快速的随机数发生器(梅森扭曲) 更多的……参见:link text

一个缺点是MKL API可能非常复杂,具体取决于所需的例程。您还可以看看他们的IPP(集成性能原语)库,该库面向高性能图像处理操作,但仍然相当广泛。

保罗

CenterSpace软件公司。NET数学库,centerspace.net

So I'm a pretty critical person, and figure if I'm going to invest in a library, I'd better know what I'm getting myself into. I figure it's better to go heavy on the criticism and light on the flattery when scrutinizing; what's wrong with it has many more implications for the future than what's right. So I'm going to go overboard here a little bit to provide the kind of answer that would have helped me and I hope will help others who may journey down this path. Keep in mind that this is based on what little reviewing/testing I've done with these libs. Oh and I stole some of the positive description from Reed.

我要在上面提到的是,尽管有GMTL的特性,但我还是选择了它,因为Eigen2的不安全性是一个太大的缺点。但是我最近了解到,Eigen2的下一个版本将包含关闭对齐代码并使其安全的定义。所以我可以换一下。

更新:我已经切换到特征3。尽管它有自己的特性,但它的范围和优雅性是很难忽视的,并且可以通过define关闭使其不安全的优化。

Eigen2 / Eigen3

优点:LGPL MPL2,干净,设计良好的API,相当容易使用。似乎维护得很好,社区也很活跃。低内存开销。高性能。适用于一般线性代数,但也有很好的几何功能。所有头库,不需要链接。

特性/缺点:(一些/所有这些可以通过当前开发分支Eigen3中可用的一些定义来避免)

不安全的性能优化导致需要仔细遵循规则。不遵守规则会导致崩溃。 您根本无法安全地按值传递 使用特征类型作为成员需要特殊的分配器定制(否则会崩溃) 与STL容器类型和可能需要的其他模板一起使用 特殊的分配定制(否则会崩溃) 某些编译器需要特别注意,以防止函数调用崩溃(GCC窗口)

GMTL

优点:LGPL,非常简单的API,专门为图形引擎设计。 包括许多面向呈现的原语类型(例如 平面,AABB,具有多重插值的四元数等) 不在其他包裹里。内存开销很低,速度很快, 使用方便。所有的头为基础,没有链接的必要。

Idiocyncracies /缺点:

API is quirky what might be myVec.x() in another lib is only available via myVec[0] (Readability problem) an array or stl::vector of points may cause you to do something like pointsList[0][0] to access the x component of the first point in a naive attempt at optimization, removed cross(vec,vec) and replaced with makeCross(vec,vec,vec) when compiler eliminates unnecessary temps anyway normal math operations don't return normal types unless you shut off some optimization features e.g.: vec1 - vec2 does not return a normal vector so length( vecA - vecB ) fails even though vecC = vecA - vecB works. You must wrap like: length( Vec( vecA - vecB ) ) operations on vectors are provided by external functions rather than members. This may require you to use the scope resolution everywhere since common symbol names may collide you have to do   length( makeCross( vecA, vecB ) ) or   gmtl::length( gmtl::makeCross( vecA, vecB ) ) where otherwise you might try   vecA.cross( vecB ).length()

维护不善 仍然声称是“测试版” 缺少基本信息的文档,比如需要哪些头文件 使用正常功能 VecOps.h不包含vector的操作,VecOps.h包含 例如,有些在Generate.h中。十字架(vec vec vec) VecOps.h, [make]cross(vec&,vec&)在Generate.h

不成熟的/不稳定的API;仍然发生变化。 例如,“cross”已经从“VecOps.h”移动到“Generate.h” 后来更名为“makcross”。文档示例失败 因为仍然引用不再存在的函数的旧版本。

NT2

不知道,因为他们似乎更感兴趣的分形图像标题的网页,而不是内容。看起来更像是一个学术项目,而不是一个严肃的软件项目。

最新版本发布于2年前。

显然没有英语文档,尽管据说在某个地方有法语文档。

在项目周围找不到社区的痕迹。

打包和BLAS

优点:年老成熟。

缺点:

老得像恐龙一样,api也很糟糕

不管怎样,艾根和犰狳我都试过了。下面是一个简短的评价。

特征 优点: 1. 完全独立-不依赖于外部BLAS或LAPACK。 2. 良好的文档。 3.据说很快,不过我还没测试过。

劣势: QR算法只返回一个矩阵,R矩阵嵌入在上面的三角形中。不知道矩阵的其余部分从何而来,也不知道Q矩阵可以被访问。

犰狳 优点: 1. 广泛的分解和其他功能(包括QR)。 2. 相当快(使用表达式模板),但同样,我没有真正将它推到高维。

缺点: 1. 依赖于外部BLAS和/或LAPACK进行矩阵分解。 2. 恕我直言,缺少文档(包括wrt LAPACK的细节,除了更改#define语句)。

如果有一个开放源码库,它是自包含的,并且易于使用,那就太好了。我已经遇到同样的问题10年了,这很令人沮丧。有一次,我使用GSL来编写C语言,并围绕它编写c++包装器,但是使用现代c++——特别是使用表达式模板的优点——我们不应该在21世纪搞乱C语言。只有我的两便士。

弗伦斯

http://flens.sf.net

它还实现了许多LAPACK函数。