我一直在疯狂地搜索谷歌和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版本.
对于数学包,我正在尝试为不同类型的矩阵提供类,例如典型的矩形矩阵,三角矩阵,对角矩阵等.原因很自然地是节省了有效存储和特殊矩阵的高效算法实现.但是我仍然希望具有重载运算符的灵活性,其中C = A + B将A和B作为任何类型的矩阵并返回相应的结果(如果其中一个操作数是矩形的,则结果可以降级为典型的矩形矩阵) .
我想到了两个可能的想法,这两个想法都很混乱:
(1)IMatrix接口,它列出了需要为每种类型的矩阵实现的所有方法,例如转置,反转等,其有效实现对于每种类型的矩阵是不同的.这里有两个问题:(a)运算符重载是静态方法,因此不能在接口中列出,甚至不能在实现接口的基类中列出.运算符重载必须分别写在每个类中,我不可能实现C = A + B类型的操作(如上所述),没有在客户端代码中进行混乱的类型检查和转换,我真的想避免.(b)当我定义运算符重载时,我不能将两个操作数都作为接口:即我不能在DiagonalMatrix类中执行以下操作:
public override IMatrix operator +(IMAtrix lhsMatrix, IMatrix rhsMatrix)
{ ... }
Run Code Online (Sandbox Code Playgroud)
(2)可以有一个矩阵类,矩阵类型变量存储在类中(可以是枚举).根据类型,我们可以实现数据结构和算法.然后,操作员重载将无缝地工作.这里有一个问题:(a)在启动特定算法之前,类可能会有很大的可能用于检查矩阵类型的switch-case语法.对于每个二元运算符,我必须有n ^ 2个case,n是我想要实现的矩阵类型的数量.也可能是维护噩梦.
看起来,如果没有运算符重载细节,我可以使用工厂模式或访问者模式,但不能使用op重载.什么是解决这个问题的最佳方法?
到目前为止我找到的资源:
编辑:
4/25/2011:到目前为止,我已经找到了有关此问题的更多资源.