標籤:解決 mem 自動化 dcom 更新 pre 情況下 控制 tty
在數學分析工具方面,MATLAB無疑是佼佼者,除了作為軟體工具外,MATLAB的自訂程式設計語言以及混合編程的支援,使其可以與Python、R之類數學分析語言媲美。尤其是在一些傳統領域的研究,由於其研究領域的專業性,研究人員一般是該專業科班出身,而電腦則是副業,因此MATLAB的應用要遠比Python和R廣泛。
MATLAB擁有眾多的演算法包,.Net平台下的F#是用於資料分析的語言,但相比較而言,MATLAB的演算法更多,計算效率更高,而且MATLAB的繪圖能力很強;另一方面,MATLAB在傳統的UI介面、程式功能控制、系統軟體整合等方面略遜,因此將C# WinForm等與MATLAB結合起來,實現高效、便捷、整合的數學分析是一個很好的解決方案,而MATLAB的混合編程則可以支援該方案的實現。
MATLAB的混合編程,即將MATLAB平台(軟體、計算引擎、DCOM服務、命令列介面等)與C#.Net等平台結合起來,分別負責某部分功能,相互傳遞資料和命令,共同實現資料分析。MATLAB與C#.Net實現混合編程的方式有兩種,一種是將MATLAB指令碼編譯為.Net程式集(dll),然後C#.Net引用該程式集實現資料分析;另一種是C#調用MATLAB執行MATLAB指令碼(m檔案),也就是俗稱使用MATLAB引擎的方式。
兩種整合方式各有優缺點,例如編譯為.Net程式集,受限於.Net程式集版本等,且需要編譯後使用,不利於版本更新;直接調用MATLAB引擎,則需要安裝MATLAB軟體。選擇何種整合模式,可根據具體需求、情境確定。網上有不少關於方案一的說明,本帖就方案二的實現做一概要說明。
MATLAB平台提供了DCOM服務、命令列介面兩種介面方式,網上一般可以看到DCOM服務的方式,該方式可以直接將命令字串傳遞給MATLAB執行個體(根據MATLAB類型反射建立MATLAB執行個體),使用其Excute方法執行代碼,並可以擷取到傳回值。次方法調用時,MATLAB將DCOM服務提供給調用者,因此執行過程和結果MATLAB程式不反饋,最終將輸出結果反饋給調用者。
System.Type oType = System.Type.GetTypeFromProgID("Matlab.Application"); object ostr = System.Activator.CreateInstance(oType); object results = oType.InvokeMember("Execute", BindingFlags.InvokeMethod, null, ostr, new object[] { data });
上述方式的一個缺點是,當MATLAB執行耗時或者出錯時,不易排查,因為調用者僅能擷取到執行結果,無法擷取到MATLAB指令碼中的debug、info等資訊,因此適用於演算法成熟、固定的情境。在演算法靈活多變或者不成熟的情況下,跟蹤指令碼執行無疑是重要的,此時可採用方式二,即調用MATLAB命令列執行。
調用MATLAB命令列執行,MATLAB將啟動應用程式,然後執行指令碼,執行過程中的輸出資訊可以輸出到命令視窗中,類似於分析人員執行使用MATLAB分析一樣,只是其分析過程實現了整合、自動化。
C#.Net與MATLAB整合