MATFOR歷經五年多的發展,支援的程式語言從FORTRAN和C++,延伸到VB與C#這兩個新興的語言,本文嘗試以VB初學者的角度來介紹MATFOR
程式開發的需求永無止境的成長
隨著IT技術的推陳出新,程式開發者也必須跟上時代的潮流學習新技術,但是當開發者透過這些技術解決了不少核心邏輯的問題後,常會遇到需要讓開發的程式更容易使用的需求,也因此程式的發展潮流從一般的console程式,逐步發展到加入視窗介面,或是透過網頁介面來執行程式,而具有研發價值的軟體還會加入特殊的資料表現方式,比如圖表方式或是加入更高階的3D視覺化方式呈現分析處理的結果。
如果觀察Windows作業系統的演進也是符合這種趨勢,從早期的文字模式,發展到圖形視窗介面,而最近推出的Vista則相當程度的強調3D繪圖的功能,使得具有3D繪圖加速的顯示卡成為Vista作業系統的基本要求,而當Vista作業系統越普及,代表能夠流暢的執行3D程式的電腦更加的普遍,所以未來程式的開發會逐漸的朝向3D視覺化來邁進。
但是想要在程式開發過程中加入3D的功能,一直不是件容易的事情,不管是用DirectX或是OpenGL來開發總是要先對電腦繪圖領域有基本的認知才行,否則開發起來會非常痛苦與緩慢,而MATFOR當初發展時就是針對這個需要來開發,讓一般的程式開發者能夠用簡單的函式呼叫(Function call),就能在自己的程式裡加上3D繪圖的功能。
此外當開發者遇到一些特殊的理論分析專案或是需要進行大量的計算時,常見的情況是已知問題的理論求解方式,但是要透過程式語言來開發時就會遇到數值計算的瓶頸,比如知道一連串的線性聯立方程式要求解未知數。如果程式開發者有修過數值計算相關的課程,還可以自行撰寫程式來算出未知數,可是大部分的工程師並沒有這方面的專業知識,此時就得借助專業的計算函式庫功能,不過這些函式庫的介面通常不容易呼叫使用,因此MATFOR發展時也有考量到這方面的需求,進一步研發與包裝數值計算的功能。
.Net版特點
微軟推出Visual Studio 2005後,讓程式開發者在開發視窗介面上所需花的時間大幅減少,且可以開發出相當漂亮的使用介面,同時也可以嵌入蠻多廠商開發的元件到視窗介面裡。
逸奇科技的研發團隊也順著這波.Net潮流,將MATFOR原有的數值和繪圖功能移植到.Net環境,讓開發者可以將MATFOR的3D繪圖引擎,嵌入到視窗介面裡,如此可將分析處理結果透過此嵌入元件進行視覺化的呈現,而使用者也可以在程式執行時隨意的放大縮小或是旋轉3D畫面,進而達到互動式的展示。
下圖為使用Visual Studio 2005開發出來的視窗程式,嵌入MATFOR Widget元件的成果畫面(資料來源:中央氣象局)
簡易的語法
MATFOR開發時為了能夠支援多達四種的程式語言,Fortran/C++/Visual Basic/Visual C#,因此採取提供函式(Function)的方式提供給開發者呼叫MATFOR的功能,而不是用物件導向的方式,藉由函式呼叫的方式可以簡化開發者的學習成本,開發者需要哪些功能就呼叫對應的函式與傳入資料,編譯完成後程式就可以得到該項功能。
另外為了簡化程式和數值有關的開發,特別研發mfArray用來處理矩陣運算和處理,減少開發者撰寫計算相關程式的時間,比如在VB裡要將矩陣的某一列或某一行進行計算,通常得使用迴圈加上矩陣的索引(index)才行,如果用mfArray就可以寫成一行程式,例如
A = B*1.5+C
描述的是將B矩陣乘上1.5加上C矩陣後,存到A矩陣,同樣的計算用VB程式碼來撰寫就須寫成下面的兩層迴圈才行。
For j = 1 to m
For i = 1 to n
A(i,j) = B(i,j)*1.5+C(i,j)
Next
Next
數值計算功能
假設要求解一組聯立方程式,有四組方程式,三個未知數,此時可將問題用矩陣型態寫成Ar = b,矩陣的內容如下圖所示,A矩陣為4*3的矩陣,b矩陣為4*1的矩陣,r矩陣為3*1的矩陣。
在使用MATFOR的數值求解功能時,此類的求解問題只要寫一行程式r = mf.LDiv(A,b)就可以算出未知數r矩陣。
或者在處理某些理論模式的計算需要用到矩陣的相乘時,以VB的程式碼通常要寫成三層的迴圈才行,可是使用mfArray搭配數值的功能只要寫成一行程式C = A.Mul(B),就可以把A矩陣和B矩陣相乘後存到C矩陣。
在數值計算的效率上,因為MATFOR是包裝Intel所開發的MKL數值最佳化函式庫,所以計算的速度會比一般自行撰寫的程式還快許多,下圖就是以單純用VB來撰寫矩陣相乘花的時間和使用MATFOR的比較圖,VB所花的時間平均是MATFOR的70倍。
如果是大型矩陣的相乘,比如2100*2100的矩陣時,VB需要花上300秒左右的時間,MATFOR則大概只要4秒鐘的時間,詳細資料可參考網路上的技術文章http://www.ancad.com/newsletters/200610/
3D繪圖功能
MATFOR支援多種的繪圖功能,包含一般平面的曲線圖表,以及三維的曲面或立體網格的繪圖等功能,這些繪圖功能因為是由程式開發者所呼叫而出現的畫面,所以開發者可以很容易的將一系列的處理結果透過MATFOR來做視覺化呈現,也就是一邊執行程式一邊呈現最新結果的呈現方式,這種動態視覺化的成果往往能夠讓使用者更加的了解,開發者想要表達的處理結果。
MATFOR的繪圖函式傳入資料型態都是mfArray,簡化所需要傳入函式介面的參數資料型態,例如要畫出一個三維的曲面只需要撰寫
mf.Surf(X,Y,Z)
X,Y,Z三個傳入的參數都是mfArray資料型態的二維矩陣,X與Y紀錄網格的座標位置,Z紀錄垂直方向的數值,就會出現下圖的畫面。
以下為一些使用MATFOR所產生的畫面結果。
- 透過曲面來表達數值分佈的趨勢
- 將相同數值範圍的區間用線條與顏色來做區分
- 三維網格可透過等值面來呈現相同數值的曲面
- 透過MATFOR呈現醫學影像結果