最近做了個項目要用到matlab做些算法處理,然后用.net項目調用這個類,我把這個matlab封裝dll總結了下如下:
matlab是商業數學軟件,優勢是在算法開發上面有很強的功能,提供了很多數學算法鞏使用者調用比一般編程語言更容易處理復雜算法問題,而且處理算法有並行處理能力,速度上比一邊編程語言也快很多.
基於組件對象模型(Component Object Model,COM)的Matlab與其他語言混合編程方法。它以Matlab中的Matlab COM Builder模塊為轉換工具,將Matlab的M函數文件轉換為COM組件后應用在VB程序中。
1.VB與其他語言混合編程的幾種方法
(1) 在Mathworks公司推出Matlab 6.5之前,Matlab與VB的混合編程主要有以下5種“1:(1) 中間文件傳遞法。用VB編寫前端用戶交互界面,收集必要的參數信息,並保存在一個中間文件(如temp.tx0中,然后利用異步程序調用方式執行Matlab程序;
(2) ActiveX自動化服務技術。將Matlab作為服務器,接收通過引擎傳來的數據和指令信息並進行相應的處理,然后將結果經過引擎返回給發送請求的客戶機;
(3) 動態數據交換(DDE)。它是進程之間的通信機制,使用Windows消息和共享的內存,使相互作用的應用程序能夠動態地交換數據;
(4) 動態連接庫(DLL)。應用MathTools公司的Mideva工具軟件,借用C++編譯器將MATLAB的M函數文件轉換為DLL,在VB中加載該DLL;
(5) MatrixVB。它是Mathworks公司相應於Matlab而開發的COM庫,在安裝MatrixVB后,開發VB程序時可以直接調用600多條Matlab中的基本函數,從而完成Matlab的矩陣運算和圖形顯示功能。
在上述5種方法中,前3種方法調用過程較復雜,且無法脫離Matlab環境,這直接影響了所開發軟件的獨立運行和發布。后兩種方法雖然能夠脫離Matlab環境,但Mideva和MatrixVB軟件已停止發行。
為解決與其它應用程序之間的接口問題,Mathworks公司在其2002年推出的Matlab6.5中新增了MatlabCOMBuilder模塊,它提供了一個簡單易用的圖形化用戶界面,幫助用戶將Matlab的M函數文件自動、快速地轉變為獨立的進程內COM組件,它以.DLL(ActiveX DLL)形式被裝入到客戶的進程空間中,可以在任何支持COM組件的應用中使用,例如Visual Ba sic、c#,Microsoft Excel、C/C++語言等。其優點在於VB訪問該COM組件時,沒有必要進行環境切換,因此可獲得最快的運行速度。
2.開發環境配置(Matlab7.11+vs2010+windows7)
(1) 在Matlab中創建COM組件Matlab COM Builder是Matlab Compiler的擴展,安裝Mat1ab7.11時至少需要選擇Matlab、MatlabCompiler和MatlabCOMBuilder等選項。
(2) 在使用COMBuilder創建COM組件之前還需要對Matlab Compiler進行必要的配置。方法如下:在Matlab命令窗中鍵入mbuild -setup,將出現選擇編譯器的提問,所列出的編譯器包括計算機中已安裝的各種C/C++編譯器,例如Matlab自帶的C/C++編譯器、BorlandC++Builder4、BoflandC++Builder5、Borland C++Builder 6、Microsoft Visual Studio 5.0、MicrosoftVisualStudi06.0、MicrosoftVisualStudio.NET等,用戶可根據需要自行選擇其中一種並確認即可。如下圖運行界面:
(3) 使用matlab7.11自帶工具,命令窗口鍵入deploytool,回車后出現對話框,選擇路徑,新建一個COM工程,target選擇為”Generic COM component”
3. COM組件的創建
安裝和配置完成之后,就可在剛生成的工程中創建COM組件
具體過程如下:
<1> 編寫M函數文件。在M函數文件中,給出要求Matlab完成的功能,函數文件能夠接收參數,也允許返回參數。另外需注意:M函數文件的文件名必須和函數名一致;且COM Builder並不是支持所有的Matlab函數,如某些工具箱函數,具體限制可參閱 Matlab Compiler users Guide;
<2> 單擊“add Class”創建類
<3> 單擊“AddFile”按鈕,添加已經在Matlab環境下編譯通過的M函數文件;
<4> 單擊“Build”按鈕。待編譯完成、生成DLL文件,至此,用戶編寫的M函數文件已轉換為COM組件對象。
<5> 將創建成功的COM組件注冊到使用它的目標計算機上,且目標計算機要安裝MCR。方法如下: 點擊package,點擊“ADD MCR”把運行環境打包
4.目標計算機以管理員身份安裝上面生成的安裝包,默認路徑安裝。安裝過程會自動在目標計算機安裝matlab運行環境和注冊之前生成的DLL。
5.然后VB工程中就可以添加引用,找到和使用之前生成的COM組件。
6.編寫程序代碼,調用Matlab中的類和函數
PS:遇到的問題:
1.調用類的時候可以編譯但運行的時候出現這個錯誤“檢索 COM 類工廠中 CLSID 為 {8E813545-D35B-4F2B-A27A-C0FFA0430223} 的組件失敗,原因是出現以下錯誤: 80040111 ClassFactory 無法供應請求的類 (異常來自 HRESULT:0x80040111 (CLASS_E_CLASSNOTAVAILABLE))。”,解決辦法將matlab 的bin目錄拷貝到path環境變量里,然后重啟下機器就OK了.
2.出現“未能確定Com引用的依賴項,加載類型庫出錯”的異常,原因為matlab庫中“C:\Program Files\MATLAB\MATLAB Compiler Runtime\v714\runtime\win32\MWComUtil”需要注冊.
3.用VS調用函數的時候,如果matlab里面函數需要一個參數,調用的時候就要寫三個參數,第一個是空值,第二個是返回值,第三個傳進去的值.