首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是最广泛使用的C++矢量/矩阵数学/线性代数库,以及它们的成本和收益权衡?

什么是最广泛使用的C++矢量/矩阵数学/线性代数库,以及它们的成本和收益权衡?
EN

Stack Overflow用户
提问于 2009-09-04 16:45:59
回答 10查看 183.3K关注 0票数 267

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

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

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

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

更新

我最终使用了Eigen3,我对此非常满意。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2009-09-04 16:55:49

有相当多的项目已经为此在Generic Graphics Toolkit上站稳了脚跟。其中的GMTL非常好--它非常小,功能非常强大,并且被广泛使用,非常可靠。OpenSG、VRJuggler和其他项目都转而使用它,而不是他们自己的手工矢量/矩阵数学。

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

编辑:

在评论、讨论和编辑之后,我想我应该抛出一些关于特定实现的优点和缺点的更多信息,以及考虑到您的情况为什么您可能会选择其中一个。

GMTL -

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

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

Eigen -

优点:Clean API,相当容易使用。包括具有四元数和几何变换的Geometry module。低内存开销。完整的,大型NxN矩阵和其他通用数学例程的highly performant求解。

缺点:可能会比你想要的范围大一点(?)。与GMTL相比,更少的几何/渲染特定例程(即: Euler角度定义等)。

IMSL -

优点:非常完整的数值库。非常非常快(被认为是最快的求解器)。到目前为止最大、最完整的数学API。商业支持的,成熟的,稳定的。

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

NT2 -

优点:提供更熟悉的语法,如果您习惯于MATLAB的话。为大型矩阵等提供完整的分解和求解。

缺点:数学,不专注于渲染。可能没有Eigen那么出色。

LAPACK -

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

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

就我个人而言,这可以归结为一个问题--你打算如何使用它。如果您只关注渲染和图形,我喜欢Generic Graphics Toolkit,因为它执行得很好,并且支持许多开箱即用的渲染操作,而不必实现您自己的操作。如果您需要通用矩阵求解(即:大型矩阵的SVD或LU分解),我会选择Eigen,因为它可以处理这些问题,提供一些几何运算,并且在大型矩阵解决方案中性能非常好。您可能需要编写更多自己的图形/几何操作(在它们的矩阵/向量之上),但这并不可怕。

票数 126
EN

Stack Overflow用户

发布于 2012-10-02 03:13:06

不管怎样,我都试过Eigen和Armadillo。下面是一个简短的评估。

特征优势: 1.完全独立--不依赖于外部BLAS或LAPACK。2.文档化。3.据称速度很快,尽管我还没有对其进行测试。

缺点: QR算法只返回一个矩阵,R矩阵嵌入在上三角形中。不知道矩阵的其余部分从哪里来,也不能访问Q矩阵。

Armadillo的优点: 1。分解范围广,其他功能(包括QR)。2.相当快(使用表达式模板),但同样,我并没有真正将其推向高维。

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

如果有一个开放源代码库是自包含的,并且使用起来很简单,那就更好了。我遇到这个问题已经有10年了,这让我很沮丧。有一次,我对C语言使用了GSL,并围绕它编写了C++包装器,但是使用现代C++ --尤其是使用表达式模板的优点--我们不应该在21世纪搞乱C语言。只是我的两便士。

票数 12
EN

Stack Overflow用户

发布于 2009-10-15 05:38:03

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

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

简而言之,它包括:

快速矩阵分解(LU decomp,hermitian,sparse)最小二乘拟合和特征值问题solvers

  • Non-linear

  • Sparse convolution

  • Very
  1. solver (信任快速信号处理例程,如快速傅立叶变换和快速随机数生成器(梅森扭曲)
  2. H115>更多...请参阅:link text

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

保罗

CenterSpace软件、.NET数学库、centerspace.net

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1380371

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档