DotNumerics,AlgLib,dnAnalytics,Math.net,F#for Numerics,Mtxvec?

时间:2010-11-11 21:22:22

标签: .net math f# libraries linear-algebra

我一直在疯狂地搜索Google和Stack Overflow,并且还没有找到任何最新的,完全相关的信息来回答以下问题:什么是最好的C#/ F#/。NET数学库(具体而言) ,包装或实现与Lapack等相同功能的那些)?

我看到的Stack Overflow上最好的帖子之一是:https://stackoverflow.com/questions/3227647/open-source-math-library-for-f

该帖子以及之前的其他帖子没有充分回答我的问题的原因是没有给出用户体验与各种图书馆的系统比较。

我感兴趣的是以下库(在实际使用中)如何完全实现Lapack(或一组广泛的功能等效线性代数);而且,我很好奇他们相对于彼此的表现,特别是在非常大的矩阵上。另外,我想了解其他人使用各种库的经验:困难,易用性等等。

以下是“免费”/开源/价格合理的.NET / F#/ C#数学库的综合列表 - 据我所知 - 它具有线性代数功能集。如果Stack Overflow上的社区能够了解他们对以下图书馆的任何经验,我将非常感激:

我对于Numerics的F#感兴趣(因为我正在使用F#)但是我很难确定各种库的优缺点。比如,哪些功能缺失或包含在各种库中,以及它们的使用方式和执行情况。

DotNumerics似乎是在C#中全面实现Lapack,但我找不到任何人在任何地方分享他们的经验。 Math.NET似乎最终可能是一个优秀的,全面的.NET数学库,但很难说它是多么活跃的项目,而且似乎它在当前阶段非常不稳定。 Alglib已经说过一两次坚固,但我想听到更多关于它们的信息。我喜欢支持原生F#数字库的想法,但我不确定开发人员(Flying Frog Consultancy)是如何致力于为Numerics支持和开发F#...以及他们计划在1.0版本中包含哪些功能以及他们的目标日期是1.0版本。

3 个答案:

答案 0 :(得分:16)

选择数学库的一个常见缺陷是我们希望存在一个数学库。

在找到图书馆之前,首先应该问“我想要什么样的数学图书馆?”。然后你将有一个标准列表,如开源与否,高性能与否,便携与否,易于使用与否。

以下是我对您列表中的库的评论(我没有使用过去的两个):

1) DotNumerics

http://www.dotnumerics.com/

他们使用fortran2C#翻译器将Lapack程序代码翻译成C#类。用户友好的C#包装器是为原始的Lapack类编写的。

2) Alglib(http://www.alglib.net/

这个库有多种语言版本,如delphi,c ++和c#。我相信它的历史比你列出的任何其他图书馆都要长。

大多数功能都是从Lapack翻译过来的。它的界面不是那么用户友好。 (但是您具有Lapack样式界面的灵活性。)使用lapack样式接口意味着您需要了解有关矩阵及其操作的更多信息。

3) dnAnalytics http://dnanalytics.codeplex.com/

这个库现在正在合并到Math.Net中。似乎合并尚未完成。 dnA中的一些函数在Math.Net中仍然不可用。

4) Math.NET http://www.mathdotnet.com/) 它的实现是从头开始的,即它不是Lapack的直接翻译。他们的目标是为.Net平台提供纯粹的托管库。这意味着易用性和可移植性是两个主要目标。一个问题是他们自己的实施是否正确。一个好处是,这个库是可移植的,你可以轻松地在Mono,XNA,Windows Mobile Phone上使用它。

上述图书馆并不专注于F#。然而,Math.Net的一名团队成员在剑桥MS研究院工作,是一名F#专家。像Cuda说的那样,他们将为图书馆设计一个F#界面。他们还将提供原生包装。但也许你会等待很长时间,超过“几个月”:)

对于高性能的关注,上面的库不提供本机包装器(至少现在)。如果你想要原生性能+ .Net,你最好使用商业图书馆。有一些开源解决方案:

<强> 1。 http://ilnumerics.net/ 这对于.Net来说是一个类似于numpy的解决方案。他们PInvoke到Lapack dll(例如netlib上的非优化lapack,AMD和Intel的优化版本。)

<强> 2。 F#中的数学提供者。在this question中阅读我的答案。由于F#源代码现在是开源的。我可以修改库并发布我的更新:)

通常你不需要一个大的数学库。您只需要一些功能,例如,如果您需要快速矩阵乘法程序,使用PInovke到平台优化的BLAS dll是最简单的方法。如果你需要为孩子们​​做一个面向教育的数学软件,那么Math.net的质量就足够了。如果您在公司并开发可靠的数学组件,那么为什么不使用由高质量团队支持的商业组件?

找到一个完美的数学库很难。但是找到解决问题的库解决方案通常很容易。

答案 1 :(得分:10)

F# for Numerics是我公司的产品,用100%F#编写。我们的重点是一般技术(从FFT到随机数生成的所有内容)而不是专门的线性代数,尽管提供了基本的线性代数例程(Cholesky,LU,QR,各种矩阵/元素类型的SVD),我们特别感兴趣的是使用F#。

如果你已经完成了LAPACK的全部工作,那么如果您有预算,我的建议为Alglib,如果您负担得起,我的建议为Extreme Optimization。 Alglib是一个完全托管的代码,带有一个“笨拙”的“古怪”API,因此运行起来相对较慢并且使用起来很麻烦。 Extreme Optimization是一个更好的API包装英特尔MKL和一些额外的例程,因此它更容易使用,运行速度更快。

我应该警告你,如果你来自开源背景,.NET库(免费,商业甚至框架本身)的一般质量相对较差。我尝试过你提到的许多其他库,并没有给它们留下深刻的印象。

答案 2 :(得分:1)

我还建议查看我在开发中使用的名为FinMath的新的.net数值库。它为许多MKL(基于它的Intel Math Kernel Library)功能提供了易于使用的.net类包装器,例如线性代数(BLAS和LAPACK),统计和FFT。此外,它还包含许多高级方法,如线性和二次规划求解器,聚类分析等。它还包括各种.net到本地c编组优化,这导致高性能和易于使用的单dll解决方案。

但不幸的是,它不是开源的,不是免费的,与LAPACK相反,大多数方法只支持双精度浮点数。并且对于很少使用的LAPACK方法,没有提供包装器。