【问题标题】:is there an open source template library for matrix computation in C or C++? [closed]是否有用于 C 或 C++ 中矩阵计算的开源模板库? [关闭]
【发布时间】:2012-03-06 05:31:51
【问题描述】:

我正在寻找一个具有线性代数标准的所有功能的库。比如行列式、矩阵求逆、乘法……但泛型。

Octave 拥有完美的双精度和复数算术库,但我需要能够更改算术的实现。

【问题讨论】:

标签: c++ math open-source matrix


【解决方案1】:

Eigen 绝对是目前 C++ 中最好的矩阵库。

http://eigen.tuxfamily.org/index.php?title=Main_Page

我热烈地建议你。

例如,此代码创建一个随机 10x10 矩阵并计算其逆矩阵:

MatrixXd A(10,10);
A.setRandom(10,10);
MatrixXd B = A.inverse();

您可以访问所有数值矩阵代数事物,例如分解、线性系统求解和其他几何算法。

只有标题,没有外部依赖,没有安装。 它适用于大量编译器,并且维护和文档记录都非常好。

【讨论】:

    【解决方案2】:

    我不知道 boost::uBLAS 能帮到你。你可以在这里查看他们的文档:http://www.boost.org/doc/libs/1_49_0/libs/numeric/ublas/doc/index.htm,这是一个基本的线性代数库。

    【讨论】:

      【解决方案3】:

      我还推荐 Eigen:它适用于小型固定大小的矩阵和大型动态分配的矩阵。但是,您可能还想查看Armadillo,它的功能集略有不同;特别是支持具有 3 个而不是仅 2 个索引(维度)的数组。

      【讨论】:

      • 从个人经验来看,Armadillo 非常擅长提供类似于 Matlab 的函数/API。这是在 Matlab 和 C++ 之间移动时需要考虑的一个重要因素(例如,为生产目的转换代码)。
      • 我从来没有发现这对 Eigen 有问题。一般来说,它也会更快(有时会更快)。所以默认情况下,我倾向于使用 eigen,除非有特定的理由不这样做。
      • 说实话;这主要是懒惰:使用纯头文件库非常容易,而且因为我为 gcc/msc 交叉编译了东西,所以我真的不喜欢使用任何二进制依赖项。 eigen 的一个可能的缺点是它假定了相当多的实现细节知识:如果您使用固定大小更好的动态分配矩阵,或者没有考虑临时和别名,您可能会失去相当多的性能。所以它的关键优势是有点脆弱。
      • 我仔细查看了Armadillo的源代码:开发人员煞费苦心地使库别名默认安全(即用户不必担心别名的影响) .该库还以不同的方式自动处理小矩阵和向量,使小动态大小矩阵的速度与固定大小矩阵相当,而用户无需显式声明固定大小矩阵。这并不是说 Eigen 不好,只是我发现犰狳更容易使用。
      • @mtall:这是一个好的开始,但这会带来巨大的性能成本。默认情况下,Eigen 也是别名安全的,但是通过将一些变量标记为 noalias,您可以避免临时变量,这对于单个 malloc 调用可以支配运行时的中小型矩阵产生巨大差异。同样,仅对小矩阵使用单独的代码流是不够的 - 仅运行时分支是一个显着的成本,例如8d 向量(更不用说 2d 或 3d),而这里真正的问题又是动态内存分配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2011-03-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2018-09-11
      • 2010-10-19
      相关资源
      最近更新 更多