在.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.html,http://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之上有一个很著名的数学计算库——NumPy和SciPy,它也被移植到了.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
当然,还有很多第三方的开源、免费和商业的组件可用。
下面就来看看,还有那些组件:
- Extreme Optimization Numerical Libraries for .NET(商业)
- .NET Matrix Library(商业)
- NMath .NET(商业)
- NAG Library for .NET(商业)
- SCINET(商业)
- Math.Net(开源)
- Dambach Linear Algebra Framework(开源)
- ILNumerics.Net(开源)
- Mapack(开源,我们的LCA软件就是使用的这个,其实我做了一个Provider可以任意切换到其他函数库上,后面我会再写篇博客来介绍)
- Meta.Numerics(免费)
另外,对于使用哪种语言来进行科学计算开发,可以参考这篇博客的一些论述:C#-F#-Ironpython与科学计算,当然个人觉得F#和IronPython都适合进行科学计算。