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

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

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

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

更新

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


当前回答

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

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

简单地说,它包括:

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

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

保罗

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

其他回答

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

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

我发现这个库非常简单和实用(http://kirillsprograms.com/top_Vectors.php)。这些是通过c++模板实现的基本向量。没有花哨的东西-只是你需要做的向量(加,减,乘,点,等等)。

有相当多的项目已经解决了通用图形工具包。这里的GMTL非常好——它非常小,功能非常强大,并且被广泛使用,非常可靠。OpenSG、VRJuggler和其他项目都改用了这种方法,而不是他们自己手工制作的vertor/矩阵数学。

我发现它非常好——它通过模板完成所有的事情,所以它非常灵活,非常快。


编辑:

在评论讨论和编辑之后,我想我应该介绍一些关于特定实现的优点和缺点的更多信息,以及根据您的情况选择其中一种而不是另一种的原因。

GMTL -

优点:简单的API,专门为图形引擎设计。包括许多面向渲染的基元类型(例如平面、AABB、具有多重插值的四元数等),这些基元类型不在任何其他包中。非常低的内存开销,非常快,易于使用。

缺点:API非常专注于渲染和图形。不包括通用(NxM)矩阵、矩阵分解和求解等,因为这些超出了传统图形/几何应用程序的领域。

艾根 -

优点:干净的API,相当容易使用。包括一个几何模块与四元数和几何变换。低内存开销。大型NxN矩阵和其他通用数学例程的完整、高性能求解。

缺点:可能比你想要的范围大一些。与GMTL相比,更少的几何/渲染特定例程(例如:欧拉角定义等)。

IMSL -

优点:非常完整的数字库。非常非常快(据说是最快的求解器)。迄今为止最大、最完整的数学API。商业支持,成熟,稳定。

缺点:成本——并不便宜。很少有特定的几何/渲染方法,所以你需要在他们的线性代数类之上滚动你自己的方法。

NT2 -

优点:如果您使用过MATLAB,则提供更熟悉的语法。提供大型矩阵的完整分解和求解等。

缺点:数学化,不聚焦渲染。可能没有Eigen表现得好。

LAPACK -

优点:非常稳定,经过验证的算法。已经存在很长时间了。完整的矩阵求解等。许多晦涩的数学选项。

缺点:在某些情况下性能不高。从Fortran移植,使用奇怪的API。

Personally, for me, it comes down to a single question - how are you planning to use this. If you're focus is just on rendering and graphics, I like Generic Graphics Toolkit, since it performs well, and supports many useful rendering operations out of the box without having to implement your own. If you need general purpose matrix solving (ie: SVD or LU decomposition of large matrices), I'd go with Eigen, since it handles that, provides some geometric operations, and is very performant with large matrix solutions. You may need to write more of your own graphics/geometric operations (on top of their matrices/vectors), but that's not horrible.

我是这个主题的新手,所以我不能说太多,但BLAS在科学计算中几乎是标准的。BLAS实际上是一个API标准,它有许多实现。老实说,我不确定哪种实现最受欢迎,或者为什么最受欢迎。

如果你还想做常见的线性代数运算(求解系统、最小二乘回归、分解等),请参考LAPACK。

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

特征 优点: 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语言。只有我的两便士。