什么是最广泛使用的C ++向量/矩阵数学/线性代数库,以及它们的成本和收益的权衡? [关闭](W

2019-06-21 21:22发布

似乎很多项目慢慢临到需要做矩阵数学,而落入第一个建筑物的陷阱一些矢量类,慢慢地加入在功能上,直到他们被逮住建立一个半称职的定制线性代数库,并根据它。

我想,以避免同时不会在一些切向相关的库(如OpenCV的,OpenSceneGraph的)依赖性。

什么是最常用的矩阵数学/线性代数库在那里,为什么会决定使用一个比另一个? 是否有任何将反对使用某种原因建议? 我特别在几何/时间上下文*(2,3,4- DIM)*使用此,而是可以使用在将来更高维数据。

我在寻找对于任何的区别:API,速度,内存使用广度/完整性,狭小/ specificness,可扩展性和/或到期/稳定性。

更新

最后我用Eigen3对此我有十分高兴。

Answer 1:

有迹象表明,对解决相当多的项目, 通用图形工具这一点。 在那里GMTL是好的 - 这是相当小的,非常实用,并且被用来足够广泛地是非常可靠的。 OpenSG,VRJuggler等项目都转为使用的,而不是自己的手卷vertor /矩阵数学这一点。

我发现它相当不错 - 它通过模板做的一切,所以它是非常灵活,而且速度非常快。


编辑:

意见讨论,修改后,我想我会扔出去的好处和缺点,以具体的实现一些更多的信息,为什么你会选择一个比其他,鉴于您的情况。

Gntla -

优点:简单的API,专为图形引擎设计。 包括向渲染(如飞机,AABB,多插quatenrions等)不在任何其他包面向许多原始类型。 非常低的内存开销,相当快,使用方便。

缺点:API是非常特别专注于渲染和图形。 不包括通用(N×M个)矩阵,矩阵分解并求解,等等,因为这些传统的图形/几何应用领域之外。

自己 -

优点: 简洁的API ,相当容易使用。 包括几何模块与四元数和几何变换。 低内存开销。 全面, 具有高性能的大N×N的矩阵和其他通用数学程序解决。

缺点:可能有点更大的范围比你想要(?)。 更少的几何/相比GMTL当渲染具体例程(即:欧拉角的定义,等等)。

IMSL -

优点:非常完整的数字图书馆。 非常非常快的(据说最快的解算器)。 迄今为止国内规模最大,最完整的数学API。 商业支持的,成熟的,稳定的。

缺点:成本 - 并不便宜。 很少几何/渲染的具体方法,所以你需要推出自己对他们的线性代数课的顶部。

NT2 -

优点:提供语法,如果你已经习惯了MATLAB是比较熟悉的。 提供完整的分解和求解大型矩阵等

缺点:数学,但没有渲染的重点。 也许并不像高性能的本征。

LAPACK -

优点:非常稳定,成熟的算法。 很长一段时间一直左右。 完整的矩阵解决等,为模糊数学的许多选项。

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

就个人而言,对我来说,把它归结为一个问题 - 你是如何计划使用此。 如果你的重点是只是渲染和图形,我喜欢通用图形工具包 ,因为它表现良好,支持开箱即用的许多有用的呈现操作,而无需实现自己的。 如果您需要通用矩阵解决(即:SVD或大型矩阵的LU分解),我会一起去征 ,因为它是处理,提供了一些几何运算,并且是非常高性能的大型矩阵解决方案。 您可能需要编写更多自己的图形/几何操作(在他们的矩阵/矢量的顶部),但是这并不可怕。



Answer 2:

所以,我是一个非常重要的人,身材如果我要投资于图书馆,我还是知道我让自己进入。 我想,这是更好的去重的批评和光在审议时的谄媚; 什么是错了,对未来比什么是正确的更多含义。 所以我要走极端这里一点点地提供这样回答会帮助我的,我希望能帮助别人谁可能的旅程走上这条道路。 请记住,这是基于什么样的小评审/测试,我与这些库来完成。 哦,我偷了一些从里德的正面描写的。

我会提到往上顶,我与GMTL去,尽管它的特质,因为EIGEN2 unsafeness是太大的下跌空间。 但我最近了解到,EIGEN2的下一个版本将包含定义将关闭对齐的代码,并使其安全。 所以,我可以切换。

更新 :我已经切换到Eigen3。 尽管它的特质,其范围和高雅太难以忽视,而这使得它不安全的优化可以用定义被关闭。

EIGEN2 / Eigen3

优点:LGPL MPL2,清洁,精心设计的API,相当容易使用。 似乎得到了很好维持一个充满活力的社区。 低内存开销。 高性能。 专为一般的线性代数,但可以很好的几何功能,以及。 所有头LIB,无需连接。

Idiocyncracies /缺点

  • 不安全的性能优化导致需要的规则小心以下。 不遵守规则会导致死机。
    • 你根本无法安全通过按值
    • 使用本征类型为成员的需要特殊定制的分配器(或者你崩溃)
    • 与STL容器类型和其他可能的模板,需要特殊的分配定制使用(或者你会崩溃)
    • 某些编译器需要特别小心,以防止对函数调用崩溃(GCC窗)

Gntla

优点:LGPL,相当简单的API,专为图形引擎设计。 包括向渲染(如飞机,AABB,多插quatenrions等)不在任何其他包面向许多原始类型。 非常低的内存开销,相当快,使用方便。 所有基于头,没有必要联系起来。

Idiocyncracies /缺点:

  • API是古怪
    • 可能是什么myVec.x()在另一个LIB只能通过myvec会[0](可读性问题)可用
      • 点的数组或STL ::载体可以使你做类似pointsList [0] [0]来访问所述第一点的x分量
    • 在优化除去横幼稚的尝试,(VEC,VEC),并用makeCross(VEC,VEC,VEC)更换时编译器消除了不必要的临时工反正
    • :除非你关闭了一些优化功能,如正常的数学运算不返回正常的类型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()
  • 没有得到很好的维护
    • 仍称为“试用”
    • 像需要哪些头正常使用functionalty文档中缺少基本信息
      • Vec.h不包含向量操作,VecOps.h包含了一些,别人都在Generate.h例如。 在VecOps.h交叉(VEC&,VEC&,VEC&),[使]在Generate.h横(VEC&,VEC&)
  • 未成熟/不稳定的API; 仍在变化。
    • 例如,“横”已经从“VecOps.h”到“Generate.h”移动,然后将更名为“makeCross”。 文档实例失败,因为仍然使用旧版本的不-不复存在功能。

NT2

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

最新版本2年多前。

显然,在英语中没有的文件,虽然据说有东西在法国地方。

无法找到项目周边社区的痕迹。

LAPACK和BLAS

优点:老和成熟。

缺点:

  • 老与非常糟糕的API恐龙


Answer 3:

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

其中大部分是基于非常成熟的BLAS / LAPACK FORTRAN标准 - MKL是为快速运行时性能精心优化。 其性能与现有内核的数量比例。 免提可用内核的可扩展性是计算的未来,我不会用任何数学库一个新项目不支持多核处理器。

简单地说,它包括:

  1. 基本向量 - 向量,向量,矩阵,矩阵,矩阵运算
  2. 矩阵分解(LU分解,厄密,疏)
  3. 最小二乘法拟合和特征值问题
  4. 稀疏线性系统求解
  5. 非线性最小二乘解算器(信任区)
  6. 加的信号处理例行程序,例如FFT和卷积
  7. 非常快速的随机数发生器(梅森捻)
  8. 更....参见: 链接文本

不利的一面是,MKL API可以根据你所需要的程序是相当复杂的。 你也可以看看他们的IPP(集成性能原件)库,向高性能图像处理操作减速,但仍然是相当广阔的。

保罗

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



Answer 4:

对于它的价值,我都试过征和犰狳。 下面是一个简要的评价。

本征优点:1.完全自足 - 外部BLAS或LAPACK无依赖性。 2.文件体面。 3.据称快,虽然我还没有把它放到测试。

缺点:QR算法返回只是一个单一的矩阵,具有嵌入在上部三角形的R矩阵。 不知道从哪里矩阵的其余部分则来自,也没有Q矩阵可以访问。

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

缺点:1.取决于外部BLAS和/或用于LAPACK矩阵分解。 2.文档缺乏IMHO(包括具体WRT LAPACK,不是改变#define语句其他)。

如果一个开源库都可以是自包含的,简单的使用将是很好。 我遇到了同样的问题,10年来,它得到令人沮丧。 在一个点上,我用GSL C和写它周围的C ++包装,而是用现代C ++ - 尤其是使用表达式模板的优势 - 我们不应该乱用在21世纪下进行。 只是我tuppencehapenny。



Answer 5:

我听说过好东西征和NT2 ,但没有亲自使用,也可以。 还有Boost.UBLAS ,我相信越来越在牙齿有点长。 NT2的开发商正在建设有得到它进入加速意图的下一个版本,这样有可能计数的财产以后。

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



Answer 6:

我是新来的这个话题,所以我不能说了一大堆,但BLAS几乎是在科学计算的标准。 BLAS实际上是一个API标准,其中有许多实现。 我真的不知道它的实现是最流行的,或者为什么。

如果你也想能够做到普通线性代数运算(解决系统,最小二乘回归,分解等)直视LAPACK 。



Answer 7:

什么GLM ?

它是基于OpenGL着色语言(GLSL)规范,并在MIT许可下发布的。 显然是针对图形程序员



Answer 8:

我会为征添加投票:我移植了很多不同库中的代码(3D几何,线性代数和微分方程)这一个 - 提高性能和代码的可读性,在几乎所有情况。

这是没有提及的一个优势:它是非常容易使用SSE与本征,这显著提高了2D-3D操作(这里的一切可以被填充到128位)的性能。



Answer 9:

好吧,我想我知道你在找什么。 看来,GGT是一个不错的解决方案,因为里德•科普塞建议。

就个人而言,我们推出我们自己的小图书馆,因为我们处理有理点了很多 - 很多理性的NURBS和贝济耶的。

事实证明,大多数3D图形库做的是在投影数学没有基础的投影点的计算,因为那是什么让你你想要的答案。 我们结束了使用格拉斯曼点,其中有一个坚实的理论基础和下降点类型的数量。 格拉斯曼点基本都是人正在使用现在,随着一个强大的理论的利益相同的计算。 最重要的是,它使在我们的脑海清晰的东西,所以我们有较少的错误。 罗恩·戈德曼在计算机图形学称为格拉斯曼点写了一篇论文“论代数和计算机图形的几何基础” 。

不直接关系到你的问题,但一个有趣的阅读。



Answer 10:

FLENS

http://flens.sf.net

它还实现了很多的LAPACK功能。



Answer 11:

我发现这个库非常简单和功能( http://kirillsprograms.com/top_Vectors.php )。 这些是通过C ++模板实现裸骨载体。 没有华而不实的东西 - 只是你需要做的与载体(加,乘减,点等)的内容。



文章来源: What are the most widely used C++ vector/matrix math/linear algebra libraries, and their cost and benefit tradeoffs? [closed]