在.NET上进行线性代数等科学计算

对于工程类、图形等专业软件,需要大量的数学计算,而用的最多的就是线性代数的计算。

那么,在.NET之上,尤其.NET 4.0和VS2010之上要如何完成相关的线性代数计算呢?我想有如下几种方式:

一,自己动手、丰衣足食:根据自己软件的需要,增量式地逐步开发一些函数库。这种方式最大的问题是——重新制作轮子,所以大部分一般不宜采用这种方式。

二,使用开源(或免费的)组件:这种方式的好处是有很多优秀的开源(或免费)的工具可选择,缺点是使用起来需要较大的学习成本

三,使用商业组件:这种方式相对于第二种的好处是,支持和服务上有所保障,缺点不言而喻就是费用较高。

下面,我将重点介绍中.NET平台上有什么用的开源(免费)组件可用。

1,使用F#进行开发

F#作为一门混合语言(函数式语言+面向对象语言),从一开始就是具有进行数学计算的优势。不仅编写计算代码更自然,F#的函数库也为数学计算提供了很好的支持。

在F#的powerpack中包含有Microsoft.FSharp.Math的命名空间就是专门用于数学计算的。其中提供了matrix类型——一种在进行线性代数计算中非常常用和重要的类型。

关于matrix类型可以阅读这里的帮助。也可以参考这个博客:http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-i-f.html

但是,要进行高效的线性代数计算,F#还需要借助外部的函数库,不过F#已经提供了相应的接口方便外部函数库集成进来,即是FSharp.PowerPack.Math.Providers.dll(这个程序集只有在FSharp-1.9.7.8中才有)。

比如,F#可以集成LAPACK(LAPACK,其名為Linear Algebra PACKage的縮寫,是一以Fortran程式語言寫就,用於數值計算函式集。 LAPACK提供了豐富的工具函式,可用於諸如解多元線性方程式線性系統方程組的最小平方解、計算特徵向量、用於計算矩陣QR分解Householder轉換、以及奇異值分解等問題。 在NetLib亦提供了API經簡化的Fortran 95版本的LAPACK95。LAPACK以BSD授權的方法釋出。)

具体的集成方式可以参考:http://fdatamining.blogspot.com/2010/03/matrix-and-linear-algebra-in-f-part-ii.htmlhttp://fdatamining.blogspot.com/2010/03/compiling-lapack-for-net-usage.html

关于如何在F#中进行代数运算,这里有一个例子:http://fdatamining.blogspot.com/2010/04/matrix-and-linear-algebra-in-f-part-iii.html

其实,我上面引用的博客地址:http://fdatamining.blogspot.com/都是值得一读的。

2,使用IronPython进行开发

Python虽然不是函数式语言,但是其动态语言特性和代码风格也被很多人用来进行工程开发。而在Python之上有一个很著名的数学计算库——NumPySciPy,它也被移植到了.NET之上(移植的过程是在微软的帮助下)。

要使用这两个库,最好的就是通过Python Tools for Visual Studio——一个在VS2010中实现的Python集成开发环境来使用。

具体的使用向导可以访问:http://pytools.codeplex.com/wikipage?title=NumPy%20and%20SciPy%20for%20.Net

3,使用C#进行开发

在.NET 4.0中,加入了System.Numerics命名空间,为数学计算提供了一定的基础,但是.NET中还是没有内置线性代数的计算函数库。不过要使用C#开发,上面提到的LAPACK和SciPy都可以用。

对于LAPACK,也有.NET的版本,就是:DotNumerics

当然,还有很多第三方的开源、免费和商业的组件可用。

下面就来看看,还有那些组件:

  1. Extreme Optimization Numerical Libraries for .NET(商业)
  2. .NET Matrix Library(商业)
  3. NMath .NET(商业)
  4. NAG Library for .NET(商业)
  5. SCINET(商业)
  6. Math.Net(开源)
  7. Dambach Linear Algebra Framework(开源)
  8. ILNumerics.Net(开源)
  9. Mapack(开源,我们的LCA软件就是使用的这个,其实我做了一个Provider可以任意切换到其他函数库上,后面我会再写篇博客来介绍)
  10. Meta.Numerics(免费)

另外,对于使用哪种语言来进行科学计算开发,可以参考这篇博客的一些论述:C#-F#-Ironpython与科学计算,当然个人觉得F#和IronPython都适合进行科学计算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
NumPy是在python中处理数据的最基本和最强大的包。 如果您打算从事数据分析或机器学习项目,那么对numpy的充分理解几乎是必须的。 其他用于数据分析的软件包(如pandas)是建立在numpy之上,用于构建机器学习应用的scikit-learn软件包也在numpy上运行。 但对于.NET开发人员来说,却没有这样的强大工具库。 虽然有像Deedle和Math.NET这样的开源库,但它们不是很容易使用,也不能借用很多现有的python代码。 NumSharp(Numerical .NET)可以说是C#中的线性代数库。 它是用C#编写的,符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码,从而最大限度地借鉴现有大量在python代码的转译成本。 NumSharp使用最新的Span技术安全高效地访问内存,优化每个模拟API的性能,确保最底层的NDArray达到最佳性能状态。NumSharp对于在数组上执行数学和逻辑运算非常有用。 它为.NET中的n阵列和矩阵的操作提供了大量有用的功能。 让我们给出一个代码片段来说明如何使用NumSharp。 // 初始化一个NumSharp实例,类名故意叫NumPy var np = new NumPy(); // 产生一个数字0到9的向量 np.arange(10) // 产生一个3维张量 np.arange(12).reshape(2, 3, 2); // 产生10个0到9的随机数,并转换成5*5的矩阵 np.random.randint(low: 0, high: 10, size: new Shape(5, 5)); 上面的代码是不是看起来否非常接近python代码?简直就是如出一辙。NumSharp的目的就是让你可以轻松的复制粘贴Python代码。 如何安装: PM> Install-Package NumSharp   NumSharp 已被如下项目使用: Pandas.NET Bigtree.MachineLearning CherubNLP BotSharp 标签:numpy

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值