从Matlab迁移到C++,应该使用哪个数值库?

14

我目前正在Matlab中原型编写一些依赖于矩阵、DSP、统计和图像分析功能的算法。

以下是一些我可能需要的示例:

  • eigenvectors
  • 2D和3D卷积
  • FFT
  • 短时傅里叶变换
  • Hilbert变换
  • Chebyshev多项式
  • 低通滤波器
  • 随机多元高斯数
  • kmeans

后面我还需要在C++中实现这些算法。

我也有 Numerical Recipes in C++ 的许可证,我喜欢它,因为它有广泛的算法和文档。 我还发现了一个可以帮助将 NR 函数封装成 MEX 的类:nr3matlab.h。所以使用这个类,我应该能够生成包装器,从而允许我从 Matlab 中调用 NR 函数。这对我来说非常重要,因为我可以在从 Matlab 到 C++ 的移植过程中检查每一步。 但是,Numerical Recipes in C++ 有一些重要的缺点:

  • 算法的实现方式简单,不一定非常高效
  • 没有线程

因此,我考虑使用另一个数值库。 理想的库应该:

  • 尽可能广泛地涵盖范围和功能
  • 有良好的文档支持
  • (有商业支持)
  • 已经有了 Matlab 封装器
  • 非常健壮
  • 非常高效
  • 有线程支持
  • (具有可以切换到 GPU 实现的功能,而不是使用 CPU)

你会推荐哪个数值库(或几个库)?

提前感谢任何答案!


2
请列出您正在寻找的一些特定函数/算法,现在这个问题太模糊了。 - Ben Voigt
谢谢。这是我想到的一些。 - Andy
只是想提一下,以便将来参考,像这样的问题可以在 [scicomp.SE] 上得到很好的解答。 - David Z
@Andy,我买了《C++数值计算方法》。这个库真是没用,但是书非常棒。 - CroCo
4个回答

5

你的需求列表很长,可能难以用单个库来满足所有需求。

对于一般的Matlab到C++转换,我强烈推荐Armadillo,这是一个模板化的C++库,专注于线性代数,同时着重于使其易于编写类似于Matlab表达式。它具有非常好的性能,文档也很详细且活跃地维护。你可以从那里开始,并尝试填补你任务中缺失的部分。


谢谢。看起来非常不错。我特别喜欢它是建立在Lapack之上,同时提供了更简单和类似Matlab的接口。 - Andy
除了BLAS接口之外,您始终可以使用更快的BLAS代替默认的LAPACK。而且Conrad非常懂行,与他合作是一种享受。 - Dirk Eddelbuettel

3

NAG可能是一个不错的选择。许多金融机构在其数学库中使用它。但我上次使用时没有GPU实现。


谢谢。看起来非常不错。你知道一个开发者许可证大约需要多少费用吗? - Andy
@ Andreas Werner Paulsen - 谷歌找到了这个链接。http://www.eduserv.org.uk/lns/agreements/nag/nag-pricing。不确定它能为您提供多少帮助。从他们的网站上看,教育机构可以获得优惠价格。 - DumbCoder

3

实际上,你应该看一下openCV

虽然它的首要目标是计算机视觉/图像处理,但这个库有很多线性代数工具(几乎所有你需要的)。这个库最初由英特尔实现,非常注重性能。它可以处理多线程、IPP等等。 语法比通常的C++库更容易使用。

你应该看一下这个cheat sheet。自2.0版本以来,语法已经改变,以模仿matlab。 这个库被广泛使用,并且活跃(最后一次大更新于2011年8月)。


我很惊讶你建议使用OpenCV而不是Eigen。 - CroCo

2

还有Eigen库:http://eigen.tuxfamily.org,但它主要作为更大框架的一部分使用。它提供基本(以及稍微复杂一些的)代数运算。


这是C++模板编程的一次壮举,但编译速度缓慢,错误信息可能会非常冗长(又糟糕又长)。 - denis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接