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.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都適合進行科學計算。
posted on 2011-03-29 22:19 redmoon 閱讀(1978) 評論(6) 編輯 收藏
.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授權
評論
2145338#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上了。