在.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都适合进行科学计算。

posted @ 2011-03-29 22:19  朱永光  阅读(4194)  评论(7编辑  收藏  举报