Cat*_*kul 235 c++ math matrix linear-algebra
似乎许多项目慢慢需要进行矩阵数学运算,并陷入首先构建一些向量类并慢慢添加功能的陷阱,直到它们被捕获构建一个半定制的自定义线性代数库,并依赖于它.
我想避免这种情况,而不依赖于一些切向相关的库(例如OpenCV,OpenSceneGraph).
有哪些常用的矩阵数学/线性代数库,为什么会决定使用另一个?有什么建议不要因某些原因使用?我特意在几何/时间上下文*(2,3,4 Dim)*中使用它,但将来可能会使用更高维数据.
我正在寻找以下任何方面的差异:API,速度,内存使用,广度/完整性,狭窄/特异性,可扩展性和/或成熟度/稳定性.
我最终使用了Eigen3,我非常满意.
Ree*_*sey 111
为此,有很多项目已经确定了通用图形工具包.那里的GMTL非常好 - 它非常小,非常实用,并且被广泛使用,非常可靠.OpenSG,VRJuggler和其他项目都转而使用它而不是自己的手动滚动/矩阵数学.
我发现它非常好 - 它通过模板完成所有工作,所以它非常灵活,速度非常快.
编辑:
在评论讨论和编辑之后,我想我会抛出一些关于特定实现的好处和缺点的更多信息,以及为什么你可以根据你的情况选择一个而不是另一个.
GMTL -
优点:简单的API,专为图形引擎而设计.包括许多面向渲染的原始类型(例如平面,AABB,具有多个插值的quatenrions等),这些类型不在任何其他包中.内存开销非常低,非常快速,易于使用.
缺点:API非常专注于渲染和图形.不包括通用(NxM)矩阵,矩阵分解和求解等,因为它们不在传统图形/几何应用领域之内.
本征 -
优点:清洁API,相当容易使用.包括带四元数和几何变换的几何模块.内存开销低.完整,高性能的大型NxN矩阵和其他通用数学例程的求解.
缺点:可能比你想要的范围更广(?).与GMTL相比较少的几何/渲染特定例程(即:欧拉角定义等).
IMSL -
好处:非常完整的数字库.非常非常快(据说是最快的解算器).迄今为止最大,最完整的数学API.商业支持,成熟和稳定.
缺点:成本 - 不便宜.很少有几何/渲染特定的方法,所以你需要在它们的线性代数类之上自己滚动.
NT2 -
优点:如果您习惯使用MATLAB,则提供更熟悉的语法.为大型矩阵等提供完全分解和求解.
缺点:数学,而不是重点.可能不像Eigen那样高效.
LAPACK -
优点:非常稳定,经过验证的算法.已经很久了.完整的矩阵求解等.模糊数学的许多选项.
缺点:在某些情况下表现不佳.从Fortran移植,使用奇怪的API.
就个人而言,它归结为一个问题 - 你打算如何使用它.如果您只专注于渲染和图形,我喜欢Generic Graphics Toolkit,因为它表现良好,并支持许多有用的渲染操作,而无需实现自己的渲染.如果你需要通用矩阵求解(即:大矩阵的SVD或LU分解),我会选择Eigen,因为它处理它,提供一些几何运算,并且非常适合大矩阵解决方案.您可能需要编写更多自己的图形/几何操作(在它们的矩阵/向量之上),但这并不可怕.
Cat*_*kul 34
所以我是一个非常关键的人,如果我要投资一个图书馆,我会更好地了解自己的成就.我认为,在仔细审查时,最好是批评和恭维奉承; 它的错误对未来有更多的影响而不是正确的.所以我会在这里稍微过一点,提供一些可以帮助我的答案,我希望能帮助那些可能沿着这条道路走下去的人.请记住,这是基于我对这些库所做的很少的审查/测试.哦,我从里德那里偷走了一些积极的描述.
我会提到我用GMTL去的顶部,尽管它的特质是因为Eigen2的不安全性太大了.但我最近了解到,Eigen2的下一个版本将包含将关闭对齐代码并使其安全的定义.所以我可能会转过来.
更新:我已切换到Eigen3.尽管它的特性,它的范围和优雅太难以忽视,并且可以通过定义来关闭使其不安全的优化.
优点:LGPL MPL2,干净,设计良好的API,相当容易使用.似乎与充满活力的社区保持良好的关系.内存开销低.高性能.适用于一般线性代数,但也有良好的几何功能.所有标题库,无需链接.
异步性/缺点:( 当前开发分支 Eigen3 中可用的某些定义可以避免这些/所有这些)
优点:LGPL,Fairly Simple API,专为图形引擎而设计.包括许多面向渲染的原始类型(例如平面,AABB,具有多个插值的quatenrions等),这些类型不在任何其他包中.内存开销非常低,非常快速,易于使用.所有标题都基于,无需链接.
Idiocyncracies /缺点:
vec1 - vec2不返回法线向量,length( vecA - vecB )即使vecC = vecA -
vecB有效也会失败.你必须像:length( Vec( vecA - vecB ) )
length( makeCross( vecA, vecB ) ) gmtl::length( gmtl::makeCross( vecA, vecB ) ) vecA.cross( vecB ).length()无法分辨,因为他们似乎对其网页的分形图像标题比内容更感兴趣.看起来更像是一个学术项目,而不是一个严肃的软件项
2年前的最新版本.
显然没有英文文档,虽然据说某些地方有法语版本.
无法找到项目周围社区的踪迹.
好处:古老而成熟.
缺点:
小智 12
为了它的价值,我尝试了Eigen和Armadillo.以下是简要评估.
特征优势:1.完全独立 - 不依赖于外部BLAS或LAPACK.2.文件体面.虽然我没有经过考验,但据称速度很快.
缺点:QR算法只返回一个矩阵,R矩阵嵌入在上三角形中.不知道矩阵的其余部分来自何处,并且不能访问Q矩阵.
犰狳的优点:1.广泛的分解和其他功能(包括QR).2.合理快速(使用表达式模板),但同样,我还没有把它推到高维度.
缺点:1.取决于外部BLAS和/或LAPACK进行矩阵分解.2.缺少IMHO的文档(除了更改#define语句之外,还包括LAPACK的详细信息).
如果一个开源库可以自包含且易于使用,那将会很不错.我已经遇到了同样的问题已有10年了,而且令人沮丧.有一次,我使用GSL for C并围绕它编写了C++包装器,但是使用现代C++ - 尤其是使用表达式模板的优点 - 我们不应该在21世纪弄乱C语言.只是我的tuppencehapenny.
Pau*_*aul 11
如果您正在寻找英特尔处理器上的高性能矩阵/线性代数/优化,我会看看英特尔的MKL库.
MKL经过精心优化,具有快速的运行时性能 - 大部分基于非常成熟的BLAS/LAPACK fortran标准.其性能随可用内核数量而变化.具有可用内核的免提可扩展性是计算的未来,我不会将任何数学库用于新项目不支持多核处理器.
简而言之,它包括:
缺点是MKL API可能非常复杂,具体取决于您需要的例程.您还可以查看他们的IPP(Integrated Performance Primitives)库,该库面向高性能图像处理操作,但是相当广泛.
保罗
CenterSpace软件,.NET数学库,centerspace.net
我听说过Eigen和NT2的好东西,但还没有亲自使用过.还有Boost.UBLAS,我认为它有点长.NT2的开发人员正在构建下一个版本,目的是将其纳入Boost,因此这可能算是一件事.
我的林.ALG.需求不超出4x4矩阵的情况,所以我不能评论高级功能; 我只是指出了一些选择.
我将为Eigen添加投票:我将大量代码(3D几何,线性代数和微分方程)移植到不同的库中 - 几乎在所有情况下都提高了性能和代码可读性.
未提及的一个优点是:使用带有Eigen的SSE非常容易,这显着提高了2D-3D操作的性能(所有内容都可以填充到128位).