摘 要: Visual C++具有應用程序界面開發能力強和程序執行效率高的特點,Matlab則具有強大的圖形顯示和數據處理功能。這兩種軟件的混合編程可以綜合它們的優點,大大提高編程效率和程序的可靠性。在此通過Visual C++和Matlab混合編程方法的對比分析,便于程序開發人員在不同的應用背景下選擇合適的編程方法。首先簡要介紹了Matlab引擎、MCC編譯器、Matcom程序、Matlab數學函數庫、動態鏈接庫、COM組件和MEX文件等7種混合編程方法,并對這些方法進行了詳細的對比分析。然后根據其分析結果,歸納總結出每種方法的優缺點,提出了這些方法的應用范圍。
關鍵詞: 混合編程; 對比分析; Visual C++; Matlab
中圖分類號: TN919?34; TP312 文獻標識碼: A 文章編號: 1004?373X(2013)20?0047?04
0 引 言
Matlab是由美國MathWorks公司開發,主要面對科學計算、可視化以及交互式程序設計的高科技計算環境[1]。它包含有大量開源算法,所使用的算法普遍都是科研和工程計算中的最新研究成果,而且經過了優化和容錯處理。它擁有強大的圖形、圖像處理能力和高速、精確的計算機數據處理能力,被廣泛應用到科學研究及工程計算的眾多領域。
Visual C++是Microsoft公司推出的一個基于Windows平臺的可視化的集成開發環境。它包括了Microsoft的代碼優化技術、強大的GUI功能以及復雜的資源編輯器,極大提高了應用程序的設計效率,開發的系統執行速度快、實時性好,而且具有接口友好、易維護和可升級等優點[2]。它已成為操作系統、設備驅動程序和系統級平臺類軟件的最佳開發工具。但缺乏對大量數據處理和分析、數據可視化分析方面的能力。
綜上可知,Matlab與 Visual C++有著各自的不同特點,將兩者進行混合編程能更有效地提升它們的優勢,提高軟件開發效率。
目前,兩者混合編程的研究大多停留在如何具體實現上[3?9],對這些方法進行對比分析研究相對甚少,程序開發人員對混合編程方法的選擇較為盲目。
因此,本文針對這些問題,詳細對比分析了Visual C++與Matlab混合編程常用的七種方法,歸納總結出了每種方法的優缺點,并提出了這此方法的應用范圍。
1 混合編程方法概述
Visual C++與Matlab混合編程主要有Matlab引擎、MCC編譯器、Matcom程序、Matlab數學函數庫、動態鏈接庫、COM組件和MEX文件等方法[3?9],如圖1所示。在對比分析這些方法特性之前,下面簡要概述一下這些實現方法。
(1)Matlab引擎(Matlab Engine)
是指一組由Matlab所提供的接口函數,采用客戶機/服務器的計算方式,并且支持Visual C++調用。
(2)Matlab數學函數庫
是由Matlab提供的包含矩陣計算的數學函數庫,Visual C++通過調用Matlab數學函數庫中的函數來實現混合編程。
(3)MCC編譯器(Matlab Compiler)
是將Matlab中的m文件轉化成C代碼、可執行文件和動態鏈接庫文件的程序,其生成的代碼可在Visual C++中和應用程序源代碼一起編譯連接成獨立的應用程序。
(4)動態鏈接庫 (Dynamic Link Library,DLL)
是由Matlab編譯器或其他編譯器將m文件或m腳本文件編譯成動態鏈接庫,Visual C++通過調用動態鏈接庫中的函數來完成與Matlab的通信。
(5)COM (Component Object Model) 組件
是以組件為單元的對象模型,按照一定的接口標準形成的一套接口函數,可重復利用和開發不同的應用軟件。
(6)Matcom
是將Matlab的m文件譯成同等功能的C++源代碼的軟件,程序開發人員可以直接使用這些C++源代碼在Visual C++中編譯鏈接成應用程序。
(7)MEX (Matlab Executable)
文件是按照Matlab定義函數的接口標準編寫C++源文件,通過Matlab中的專用工具將C++源文件轉換而來,其可在Matlab環境下直接被調用。
2 Visual C++和Matlab混合編程方式的對比 分析
2.1 七種混合編程方法總體對比
七種混合編程方法以不同的方式實現了Visual C++與Matlab的編程交互。為了便于程序開發人員能快速有效地選擇適合的混合編程方法,明確每種混合編程方法的優缺點及其應用場合則顯得十分重要。下面首先從三個角度對這幾種方法作了縱向的對比分析,具體如表1所示。
(1)在軟件集成度方面
即是否獨立于Matlab運行。Matlab引擎集成度最低,因為其要有后臺運行的Matlab的支持才能發揮作用,且運行效率不高。而MEX文件是Matlab中調用C++語言源代碼,直接在Matlab環境下運行,因此不能脫離Matlab。另外5種方法集成度都高,其中Matlab數學函數庫可直接被Visual C++調用,而Matcom和MCC則是通過轉換m文件為cpp文件的方法來實現通信,動態鏈接庫和COM組件通過調用DLL文件的方法來實現混合編程,運用這五種方法編寫的應用程序都可以脫離Matlab單獨運行。
(2)在支持三維圖形方面
Matlab引擎支持性最好,因為其圖形的相關計算都是在Matlab環境下進行,與直接在Matlab下顯示的三維圖形并沒有多大的區別。而Matlab數學函數庫主要包含了數學計算類的函數,三維圖形顯示類函數較少,因此其支持性差。
另外Matcom和MCC在三維圖形的顯示上也較差,因為并不是所有的三維圖形函數能被轉換成cpp文件,此外三維圖形函數的轉換會影響算法的效率,圖形顯示效果較差[8]。而動態鏈接庫和COM組件在支持三維圖方面還是不錯的,但不管從支持圖形顯示的函數上還是顯示的效果,都比不上Matlab引擎。
(3)在靈活性方面
Matlab引擎是通過ActiceX與Matlab進行通信,幾乎能夠應用Matlab中的所有功能,從操作角度和應用層面上來考慮靈活性很好,大多應用于算法調試與仿真等對集成度要求不高的場合[5?7]。而MEX方式只要編寫好mexFunction、MainWndProc和DrawData這三個函數并編譯生成MEX文件,就可供Matlab調用C語言代碼,這種方式的靈活性也是很好的。Matcom和MCC兩種方法都是基于代碼轉換的原理來完成混合編程的需要,代碼更新和操作基本相同,但不能調用包含內聯函數的程序,在功能實現上受到一定的限制,應用會受到一定的約束。同樣,動態鏈接庫和使用COM組件的方法在靈活性方面并沒有太大差異,較Matlab引擎和MEX方式差一些。
除了以上三個方面的分析結果,還有值得注意的一點是,MEX方式是惟一能在Matlab中調用Visual C++代碼的方法。使用這種方法,可以使程序開發人員能在Matlab中充分發揮C/C++的優越性能,加速程序的運行速度,擴展程序的功能[9]。當程序中對數學計算較多時,就會考慮使用Matlab數學函數庫方法,這種方法可以很靈活的調用Matlab來編寫應用數學計算類的程序。在表1中Matcom與MCC、動態鏈接庫與COM組件這兩組方法的區別不是很明顯,下面詳細對比分析這兩組方法,找出它們之間的差距,使程序員能更好地利用這些方法進行程序開發。
2.2 Matcom與MCC的對比分析
圖2為Matcom與MCC實現原理圖,從圖中可以看出Matcom軟件是將m腳本或m函數文件轉換為cpp文件或DLL文件;而MCC只能將m函數文件轉換為c文件、cpp文件或MEX源文件。Matcom必須要安裝Visual C++編譯器,安裝完成后就可直接在Visual C++下轉換m文件,其轉換過程簡單,執行效率高,容易實現,適合于需要大量計算方面的應用[9?11]。
在對三維類圖形的支持上,由于MCC是MATLAB自帶的編譯器,它的函數功能和執行效果明顯優于Matcom[13],雖然轉換的C代碼冗余度大,可讀性不強,但可提高開發效率和可靠性。在使用這兩種方法時還值得注意的是:在對數據類型的支持上Matcom對struct等類的支持有缺陷。MCC編譯器不能使用Matlab對象,也不能用input或者eval來操作Matlab空間變量,同樣也不能動態地命名變量;在函數的使用上,由于Matlab的內置函數沒有給出C/C++接口,MCC還沒有轉換Matlab內聯函數的能力。
2.3 動態鏈接庫與COM組件的比較
圖3為動態鏈接庫與COM組件實現原理圖。從圖中可以看出動態鏈接庫通過MCC編譯器或Matlab Add?in工具,將m腳本或m函數文件轉化為DLL文件;而COM組件只能由COM Builder將m函數文件轉化為COM組件。這兩種方法具有很多共同的優點,如方法實現簡單,通用性很強,可以供多個應用程序調用,實現代碼共享等。動態鏈接庫還具有算法和數據的保密優點,孟虎等人利用這種方法完成了雷達信號與系統的分析[13?14];但它對配置環境要求較高,存在著函數重名以及路徑問題。COM組件則克服了動態鏈接庫中的不足,通過制定復雜的COM組件協議,COM本身的機制改變了重用的方法,并以一種新的方法來重新利用動態鏈接庫,該方法執行效率高,集成度高,易于移植,多在軟件系統中應用,是解決信息和圖像處理編程的一種有效途徑[15?17]。
3 結 論
本文對比分析了Visual C++與Matlab混合編程的方法,這些方法各有特點,其實用性與應用范圍也不盡相同,程序開發人員可以根據需要選擇最佳的解決方案。Matlab引擎無法脫離Matlab,運行效率不高但幾乎能實現Matlab中所有的功能,因而適用于除運算速度和集成度要求較高的軟件應用開發以外的所有應用,如算法調試與仿真。
MEX是惟一在Matlab中調用C程序的方法,可以充分利用C語言算法資源,提高數據計算和分析的能力和效率。利用Matcom方式有效地解決了執行效率等問題,適合于需要大量計算的應用領域,但對繪制三維圖形的函數支持性不強。
MCC轉換的C代碼冗余度大,可讀性不強,但其可換來高開發效率和可靠性,相對于Matcom而言對三維圖像的支持較好,可適用于小型系統開發和算法研究。動態鏈接庫有利于算法和數據的保密,實現代碼共享,但對配置環境要求較高。COM組件方式雖然操作較為復雜,但其執行效率高,支持相對較多的Matlab函數,易于移植,是解決信息和圖像處理編程的一種有效途徑,適用于軟件的開發和應用。
參考文獻
[1] HANSELMAN D.精通Matlab7[M].朱仁峰,譯.北京:清華大學出版社,2006.
[2] 高守傳.Visual C++6.0開發指南[M].北京:人民郵電出版社,2007.
[3] 劉維.精通Matlab與C/C++混合程序設計[M].北京:北京航空航天大學出版社,2012.
[4] 王曉春,曹鳴,羅永新.基于COM的VC與Matlab的混合編程技術[J].現代電子技術,2004,27(19):16?17.
[5] 李文煜.VC與Matlab混合編程實現圖像處理[J].計算機仿真, 2005,22(1):254?257.
[6] 凌云峰,朱齊丹,甄景蕾,等.基于VC與MATLAB的全景視覺反射鏡設計[J].計算機應用與軟件,2008,25(41):99?101.
[7] 楊俊.變電站遙視圖像的識別研究[D].保定:華北電力大學,2004.
[8] 徐彬,張偉成.分別基于Matcom與COM的VC、Matlab混合編程探討與比較[J].微型電腦應用,2008,24(12):59?60.
[9] 廖瑞華.基于mex文件的VC與Matlab的混合編程[J].中國科技信息,2006,(5):75?76.
[10] 郭慶葉.慣導平臺車載試驗的仿真系統及辨識方法研究[D]. 哈爾濱:哈爾濱工業大學,2008.
[11] 楊玲.軋機診斷系統扭矩間接監測與疲勞壽命預測的研究[D].武漢:華中科技大學,2003.
[12] 艾雨.基于單片機的太陽能電池數據采集系統研究[D].武漢: 武漢理工大學,2010.
[13] 姚鎖寧.基于Matlab/VC的教學評估系統研究與開發[D].西安:西安理工大學,2008.
[14] 宋維瑞.毫米波雷達中頻模擬信號源控制部分的研究[D].哈爾濱:哈爾濱工業大學,2008.
[15] 漢澤西,甘志強,鄧武.Matlab與VC++混合編程實現一維小波多尺度分解[J].電子測量技術,2008,31(6):58?61.
[16] 陳龍,苑秉成,謝勇,等.基于Matlab與VC的魚雷彈道三維可視化的實現[J].艦船電子工程,2013,33(2):138?140.
[17] 敬人可,李建增.混合編程在實時超聲無損檢測中的應用[J]. 國外電子測量技術,2012,31(6):63?66.
[18] 孟虎.合成孔徑雷達系統相位誤差研究及其綜合分析[D].北京:中國科學院電子學研究所,2004.