面朝大海,春暖华开

focus on scientific computue, 3dgis, spatial database
专注于科学计算、GIS空间分析

 

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

link: http://www.cnblogs.com/redmoon/archive/2011/03/29/1999242.html

 

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

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

2
0
(请您对文章做出评价)
« 博主前一篇:DefaultNetworkCredentials vs DefaultCredentials
» 博主后一篇:在Windows 7中遇到android 模拟器出错,emulator: ERROR: unknown virtual device name的正确解决办法

posted on 2011-03-29 22:19 redmoon 阅读(1978) 评论(6) 编辑 收藏

评论

#1楼 2011-03-30 00:12 egmkang      

有人会用么?  回复 引用 查看   

#2楼 2011-03-30 00:16 grapeot      

就之前的经验来看,还有一个库Accord.NET非常好用,尤其是机器学习/图像处理/计算机视觉方面的东西很适用。  回复 引用 查看   

#3楼 2011-03-30 14:32 JimLiu      

用过dnAnalytics.LinearAlgebra,后来这个项目整合到Math.NET上了。

 

 .net上科学计算个人觉得首选numpy和scipy for dotnet。
因为这两个库用户数量已经非常多了,资料和扩展库也很多。
不过开发使用Ironpython语言的。

如果想使用F#开发,我推荐Math.net!
首先他是个老牌的计算库,用户也不少,资料完备。
而且它提供专门的for F#模块,方便F#使用,锦上添花。
http://numerics.mathdotnet.com/

Math.net曾经停滞过很久,最近又复活了,而且发展很大。
下面是简介,具体的可以看官方网站。

Math.NET是一个用c#编写的,运行在微软.net平台下的开源数学工具包,它的目的利用一个不依赖于第三发组件的简洁框架来满足科学数值和符号代数计算。这个项目大部分采用的是MIT/X11开源软件协议,部份采用的是GPL 或 LGPL协议。

 

Math.NET包含下列几个模块:

 

Math.net,.net上的科学计算利器

link: http://blog.csdn.net/lv_q/article/details/7044667
 Math.NET Numerics
这个是Math.NET工程的数值计算部分,其目的是针对科学计算领域, 工程和日常应用,提供一些方法和算法。涵盖的领域包括专业函数,线性代数,概率模型,随机数,插值,积分变换等等。自由软件,开源,基于MIT/X11 License
Math.NET Iridium
 Iridium 是Math.NET Numerics的前身,它会尽快的被Numerics所取代。自由软件, 开源,基于LGPL授权
 Math.NET LinqAlegebra
LinqAlgebra(以前被称为Palladium)提供了一些基于纯Linq表达式顶层的元素,可以应用于通用的代数计算系统。
自由软件, 开源,基于LGPL授权
 Mth.NET Neodyma
提供了一个用于数字信号处理的工具箱(DSP)
自由软件, 开源,基于LGPL授权
 Math.NET Yttrium
Yttrium 是一个实验性的计算代数结构,应用于形式上是硬件工程和数字信息的一些想法和概念,从一个不同的、全新的角度来看抽象数学和代数。用专业的图表来表现(代替了树)整个系统,而不单单是表达式。
由软件, 开源,基于GPL授权
Math.NET Classic
一个经典的利用树来表达的代数计算系统工具(和Maple,Mathematica相似,当然没他们那么给力)。其目标是提供一个延展框架来实现对代数表达式的符号控制。并且,基础解析器能够把简单表达式解析成符号树或翻译成数学程序。
由软件, 开源,基于GPL授权

 

posted on 2011-12-24 21:08  风过 无痕  阅读(4058)  评论(0编辑  收藏  举报

导航

向日葵支付宝收钱码