DotNumerics,AlgLib,dnAnalytics,Math.net,F#为Numerics,Mtxvec?
我一直在搜索谷歌和堆栈溢出像疯了几天,还没有找到任何最新的,完全相关的信息来回答以下问题:什么是最好的C#/ F#/。NET数学库(特别是那些包装或实现与Lapack相同的功能等)?DotNumerics,AlgLib,dnAnalytics,Math.net,F#为Numerics,Mtxvec?
一个堆栈溢出更好的职位,我没有看到的是:https://stackoverflow.com/questions/3227647/open-source-math-library-for-f
是该职位,和其他以前的帖子,没有充分回答我的问题是,原因是用户体验没有系统的比较与各种图书馆给予。
我对以下库(在实际应用中)如何完全实现Lapack(或广泛的等价线性代数的功能)感兴趣;而且,我很好奇他们彼此的表现,特别是在非常大的矩阵上。此外,我想听听其他人使用各种库的经验:困难,易用性等。
下面是“免费”/开源/经济实惠的.NET/F#/ C#数学就我所知,它有一个线性代数特征集。我深深体会到,如果在这里堆栈溢出社区将与他们有任何经验与以下库凑钱:
我对F#的Numerics感兴趣(因为我在使用F#),但我很难确定各种库的优缺点。比如,哪些功能缺失或包含在各种库中,以及它们使用的方便程度以及它们的表现如何。 DotNumerics看起来像是C#中Lapack的全面实现,但我找不到任何人在任何地方分享他们的经验。 Math.NET似乎最终可能是一个优秀的,全面的.NET数学库,但很难说出项目的活跃程度,看起来在目前阶段它非常流行。阿尔格利布已经说过一两次了,但我想更多地了解他们与其他人的关系。我喜欢支持本地F#数字库的想法,但我不确定开发者(Flying Frog Consultancy)是如何承诺支持和开发针对Numerics的F#以及他们计划在1.0版本中包含哪些功能以及它们的功能目标日期是1.0版本。
选择数学图书馆的一个常见错误是,我们希望存在一个数学图书馆的一切。
找到图书馆之前,应该首先问“我想要什么样的数学图书馆?”。然后,您将获得一系列标准,例如开源与否,高性能与否,便携与否,易用与否。
以下是我对您的列表库评论(我没有使用过的最后两个):
1)DotNumerics
他们使用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现在。似乎合并尚未完成。在Math.Net中,dnA中的一些函数仍然不可用。
4)Math.NET(http://www.mathdotnet.com/) 它的实现是从零开始的,即,它不是来自LAPACK直接翻译。他们的目标是为.Net平台提供纯粹的管理库。这意味着简单的使用和便携性是两个主要目标。一个问题是,他们自己的实施是否正确。一件好事就是这个库是可移植的,因为您可以毫不费力地在Mono,XNA,Windows Mobile Phone上使用它。
上面的库不专注于F#。然而,Math.Net的团队成员之一为MS Research Cambridge工作,并且是F#专家。像Cuda说的那样,他们将为图书馆制定一个F#界面。他们也将提供本地包装。但是,也许你会等待很长时间,超过“几个月”:)
为了提高性能,上面的库不提供本地包装器(至少现在)。如果你想要本地性能+ .Net,你最好使用商业库。有一些开源解决方案:
1. http://ilnumerics.net/这是一个numpy类似于.Net的解决方案。他们PInvoke到Lapack dll(例如netlib的非优化lapack,AMD和Intel的优化版本)。
2. F#中的数学提供者。在this question阅读我的答案。由于F#源代码现在是开源的。我可以修改图书馆并发布我的更新:)
通常你不需要一个大的数学库。您只需要一些功能,例如,如果您需要快速矩阵乘法程序,则使用PInovke进行平台优化的BLAS dll是最简单的方法。如果你需要为孩子做一个教育导向的数学软件,那么Math.net的质量就足够了。如果您在一家公司开发可靠的数学组件,那么为什么不使用由高质量团队支持的商业组件呢?
找到一个完美的数学库很难。但找到解决问题的库通常很容易。
谢谢尹先生对我感兴趣的许多图书馆的洞察力,并分享你对.Net中数学图书馆的想法。另外,谢谢Ilnumerics的其他建议 - 我也会看看那个图书馆。我确实访问过您的博客,并试图在F#教程中关注您的Math Provider,但这超出了我的初学者技能水平。我将BLAS编译为.dll,但是我没有成功编译LAPACK,因此我放弃了将搜索转向可能更易于使用的库。目前,我是一名希望使用F#进行建模和模拟的学生。 – Abe 2010-11-13 03:59:34
当我有一些空闲时间时,我会发布这个包含所有必要运行时间的库。 – 2010-11-13 06:20:06
那将是美妙的殷!对于像我学习F#技术意图的人来说,您的网站/博客是一种宝贵的资源。我会在你的网站上寻找这个版本(也许还有一个关于F#使用提示的提示)。对于那些正在关注这个主题的人 - 或者稍后发生 - Yin的网站位于:http://fdatamining.blogspot.com/。但是,是的,编译后的dll将会有所帮助,例如使用它们。通常情况下,如果我至少有一个全面的示例需要遵循和分析,我可以弄清楚。非常感谢你对F#社区的贡献,Yin! – Abe 2010-11-14 22:19:31
F# for Numerics是我公司的产品,用100%F#编写。尽管提供了基本的线性代数程序(Cholesky,LU,QR,各种矩阵/元素类型的SVD),但我们强调的是一般技术(从FFT到随机数生成的所有内容),并非特定线性代数,我们特别关注易用性从F#使用。
如果您在LAPACK的完整范围之后,那么我的建议是Alglib(如果您是预算的话)或Extreme Optimization(如果您负担得起)。 Alglib完全是一个管理代码,带有一个“怪异”的API,所以它运行起来相对较慢并且使用起来很麻烦。 Extreme Optimization是一个更好的API,它封装了英特尔MKL和一些额外的例程,因此它更易于使用,运行速度更快。
我应该警告你,如果你来自开源背景,.NET库(免费,商业,甚至框架本身)的总体质量相对较差。我尝试了许多你提到过的其他图书馆,而且他们一点都不感兴趣。
你能提供一些证据表明框架没有很好的实施或设计? – 2010-11-12 15:23:07
当然,看看序列化是如何通过在每一步中反映每个值来实现的,而不是通过每种类型反复使用类型和运行时生成代码并重用它。这就是为什么.NET上的序列化速度比OCaml慢170倍以上。根据F#团队的说法,'[1..1000000] .GetHashCode()'堆栈溢出是由于框架中的设计缺陷而无法解决的。这些只是我遇到的几个最近的问题。总的来说,我认为组件之间的互操作性在.NET上更好,但组件本身的质量更差。 – 2010-11-12 23:37:17
据一位同事介绍,.NET 4中的COM互操作会泄漏字符串。我从来没有见过像我在其他系统中使用.NET 4报告过的那样严重的GC错误:http://flyingfrogblog.blogspot.com/2010/10/can-you-repro-this-64-bit- net-gc-bug.html – 2010-11-12 23:41:41
我也可以建议查看新的.net数字图书馆,名为FinMath,这是我在开发中使用的。它为许多MKL(基于它的Intel Math数据库)功能(如线性代数(BLAS和LAPACK),统计数据和FFT)提供了易于使用的.net类包装。此外,它还包含许多高级方法,如线性和二次规划求解器,聚类分析等。它还包括各种.net到原生c编组优化,从而导致高性能和易于使用的单个dll解决方案。
但不幸的是它不是开源的,不是免费的,与LAPACK相比,大多数方法只支持双精度浮点实数。对于少数几个很少使用的LAPACK方法封装不提供。
我添加.NET标记,因为这个问题涉及的.Net数学库。 – 2010-11-12 02:52:42
dnAnalytics不再支持,所以不应该使用。其所有功能已被移入Math.NET Numerics(本机库支持除外)。 Math.NET Numerics一直处于不断变化之中,但API已经稳定下来,我们即将发布1.0测试版(仅限托管代码)。我们正在努力提高托管代码的性能并添加本地包装器(MKL,ATLAS和ACML)。我们将在未来几个月发布1.0版本。 而我们正在研究一个F#接口库。 – cuda 2010-11-12 04:27:09
复制该cuda。我一定会把Math.NET留在我的未来。我喜欢Math.NET所见过的很多功能(功能明智,实施或计划),所以我认为您和其他贡献者可以使图书馆的性能具有竞争力,并将本地包装程序合并到可消化/可接近的方式。无论何时您将Math.NET推出门户 - 假设其性能良好 - 这对社区来说将是一大福音。非常感谢您和其他贡献者的辛勤工作! – Abe 2010-11-14 22:31:07