宗節(jié)保,尹 忠,成鴻飛,段柳云,王 瑩
(武漢大學 電子信息學院,湖北 武漢 430072)
MATLAB是Mathworks公司推出的一款功能強大的數(shù)學軟件,它集數(shù)值分析、矩陣計算、信號處理和圖形顯示于一身,包含大量高度集成的函數(shù)可供調(diào)用,命令語句功能強大,為科學研究、工程設計及眾多學科領域提供了一種簡潔、高效的編程工具,并在圖像處理、控制設計、信號檢測、金融建模設計等領域得到廣泛應用[1]。但是MATLAB使用的是解釋性語言,這限制了它的執(zhí)行速度,不利于開發(fā)各種應用軟件[2]。相比之下,VC是Windows平臺下主要的應用程序開發(fā)環(huán)境之一,它能方便實現(xiàn)軟件開發(fā),開發(fā)出的系統(tǒng)具有界面友好、執(zhí)行速度快、易維護和升級等優(yōu)點[3]。同時,VC因其與操作系統(tǒng)和底層硬件交換的效率而在高級語言中得到廣泛應用。
因此,如何實現(xiàn)VC和MATLAB的混合編程來提高代碼運行效率就成了一個研究方向。一般情況下大多數(shù)應用側(cè)重于通過在VC中利用MATLAB強大的數(shù)學運算功能[4-5],而在MATLAB中利用VC進行軟件開發(fā)的例子比較少。然而利用MATLAB語言制作軟件的過程中,經(jīng)常會碰到一些MATLAB程序無法解決的問題,此時如果通過混合編程調(diào)用VC/VC++,這些問題便可迎刃而解。這種混合編程方法的運用,不僅能夠更好地發(fā)揮MATLAB強大的功能,還能縮短軟件開發(fā)周期,因而在仿真技術研究中具有重大實用價值。
本文將具體論述在MATLAB中調(diào)用VC的混合編程方法并將其應用于MATLAB的自動索引中從而極其方便地打開chm格式幫助文檔并自動定位到文檔的相應位置。
在MATLAB平臺上調(diào)用VC一般是因為使用MATLAB語言來實現(xiàn)特定算法功能代碼復雜、運行效率低下。這時候利用VC與系統(tǒng)和底層硬件交換效率及其強大的調(diào)試功能可以編寫高效的算法程序,然后通過將VC上的源程序編譯成可供MATLAB使用的庫文件或MEX文件無疑很好地發(fā)揚了兩種語言的優(yōu)勢。
VC和MATLAB混合編程的方法有很多種,主要分為以下幾種:1)通過 MATLAB Engine方式;2)直接調(diào)用 MATLAB的VC數(shù)學函數(shù)庫;3)使用matcom工具;4)使用MATLAB的combuilde工具;5) 用 MATLAB自帶的 MATLAB Compiler[6]。在這5種方法當中,前4種一般用在VC中調(diào)用MATLAB函數(shù)的場合,第5種二者皆可并且簡單易行,由于本文中是要實現(xiàn)在MATLAB中調(diào)用VC函數(shù),故利用Compiler把VC編寫的源程序即cpp程序編譯成MEX文件供編寫M文件時調(diào)用。
一個MEX文件的源程序是包括入口程序和算法程序的。當對C語言的MEX文件進行編譯時,MATLAB首先從命令行獲取輸入矩陣,并賦給入口程序的輸入?yún)?shù)指針組,入口程序?qū)斎雲(yún)?shù)進行計算后創(chuàng)建輸出矩陣,并將其賦給入口程序的輸出參數(shù)指針組,最后使用入口程序的輸入?yún)?shù)和輸出參數(shù)作為算法程序的參數(shù)調(diào)用算法程序[7]。
下面以 MATLAB自帶的一個 c-mex文件為例來說明MEX文件的執(zhí)行流程。文件的源程序為timestwo.c,該程序?qū)崿F(xiàn)一個數(shù)據(jù)兩倍乘法過程。它有一個輸入?yún)?shù)和一個輸出參數(shù)。這里用到mex.h中定義的兩個函數(shù):mexGet()函數(shù)用于返回句柄的屬性;mexCreat()用于創(chuàng)建矩陣。 圖(1)以[y]=f(x)為例完整地表明了文件輸入數(shù)據(jù),算法程序調(diào)用和計算結(jié)果返回的過程。
MATLAB中調(diào)用VC的混合編程方法總體實現(xiàn)過程如圖2所示。
1.2.1 MATLAB編譯環(huán)境的設置
在MATLAB與VC混合編程之前,必須先對MATLAB的編譯應用程序MEX和編譯器mbuild進行正確的設置。
對MATLAB編譯應用程序MEX的設置:Mex-setup。再根據(jù)系統(tǒng)提示進行選擇路徑和編譯器。對MATLAB編譯器mbuild的設置:Mbuild-setup。同理,按后面提示結(jié)合個人需要選擇即可。
1.2.2 以混合編程方式創(chuàng)建cpp源文件
為了能夠在MATLAB中調(diào)用VC,必須要有接口函數(shù)來起到“橋梁”的作用,在MATLAB中mexFunction就是這樣一個函數(shù),它同時也是MEX文件的一個專用接口函數(shù)。
而mexFunction函數(shù)則包含在頭文件“mex.h”中,混合編程時需要用到這個接口函數(shù),它含有4個參數(shù),其中nlhs表示輸出參數(shù)個數(shù),nrhs表示輸入?yún)?shù)個數(shù),plhs是一個數(shù)組,其內(nèi)容為指針且指向所有的輸入?yún)?shù),該指針指向數(shù)據(jù)類型mxArray,prhs是一個指向輸出參數(shù)的指針數(shù)組,值得注意的是prhs是const的指針數(shù)組,即不能改變其指向內(nèi)容。
1.2.3 mex文件的生成與調(diào)用
cpp文件是C++中的源文件,在MATLAB中無法直接調(diào)用或運行,只有通過轉(zhuǎn)化為MEX文件后才能在MATLAB中調(diào)用它??梢酝ㄟ^在MATLAB命令窗口中直接輸入MEX指令即可將相應的cpp源文件編譯成MEX文件。
在MATLAB中生成的MEX文件名同時也是調(diào)用時的函數(shù)名,一般情況下在該調(diào)用函數(shù)時需要輸入一些混合編程時已定義好的參數(shù)。這樣在編寫M文件時可以直接調(diào)用相應的MEX類型函數(shù)了。
給出利用MATLAB中調(diào)用VC的混合編程方法來具體實現(xiàn)在MATLAB中文檔的自動索引。目前MATLAB尚不提供在其GUI控件的回調(diào)函數(shù)中直接編寫代碼定位到chm格式文檔的方法。通過VC和MATLAB的混合編程,利用VC編寫源程序并編譯成MEX文件,這樣在GUI控件的回調(diào)函數(shù)就可以通過 mexzdsy(’hh.exe ms-its:URL’)語句來直接定位到相應的文檔頁面,這無疑提高了編程效率,方便了用戶使用。
VC源文件名為mexzdsy.cpp,核心代碼如下:
在該例中WinExec函數(shù)包含在頭文件“Windows.h”中,它也正是所需的VC中的函數(shù),為了將mexzdsy.cpp這一文件轉(zhuǎn)化生成MEX文件,需要在MATLAB的命令窗口中輸入“mex mexzdsy.cpp”,則在當前工作目錄下會生成一個名為“mexzdsy.mexw32”的文件,這一文件便是所需的MEX文件。
這樣,可以在MATLAB的M文件編寫中通過mexzdsy(’hh.exe ms-its:索引頁地址’)這一形式語句來實現(xiàn)自動索引。其中hh.exe是Windows自帶的系統(tǒng)文件,它用于打開chm格式的幫助文檔,“ms-its”是一種協(xié)議,它定義了如何打開htm或html格式的文檔,而索引頁地址就是在幫助文檔中顯示的那一頁的URL。
利用MATLAB中調(diào)用VC的混合編程方法,在基于MATLAB程序制作的教學軟件中實現(xiàn)了幫助文檔的自動索引。幫助文檔help.chm放在help文件夾中,例如如圖3所示的軟件界面。
點擊按鈕“動目標顯示(MTI)”便會自動打開如圖4所示的幫助文檔并索引到指定頁。
在基于MATLAB語言制作的軟件中,如果單純的利用MATLAB語言只能打開該幫助文檔但無法索引到指定頁,而通過混合編程在MATLAB中調(diào)用VC函數(shù)WinExec則有效的解決了這一問題。
從上面的分析中可以看出要實現(xiàn)在MATLAB中調(diào)用VC語言函數(shù),關鍵是要掌握MATLAB中的接口函數(shù)和一些重要VC函數(shù)的用法,寫出符合要求的VC源程序。VC和MATLAB混合編程可以充分發(fā)揮兩種軟件的優(yōu)點,減少了代碼重用,提高了程序運行速度。通過將VC和MATLAB混合編程引入到MATLAB文檔的自動索引中彌補了MATLAB在這方面的不足之處,方便了用戶的使用。隨著MATLAB版本的升級,Mathworks公司有意加強了MATLAB在與其他高級語言混合編程方面的功能,相信這一混合編程的優(yōu)勢將應用于更廣闊的領域。
[1]潘大夫,汪渤,周志強.Matlab與C/C++混合編程技術研究[J].計算機工程與設計,2009,30(2):200-210.
PAN Da-fu,WANG Bo,ZHOU Zhi-qiang.Technical research of hybrid programming by MATLAB and C/C++[J].Computer Engineering and Design.2009,30(2):200-210.
[2]潘孝勇,姜偉,楊繼隆.Visual C++與MATLAB混合編程[J].計算機仿真,2004,21(3):140-143.
PAN Xiao-yong,JIANG Wei,YANG Ji-long.Hybrid programming by Visual C++ and MATLAB[J].Computer Simulation,2004,21(3):140-143.
[3]王周益,劉繼興,柳長安.VC++與MATLAB混合編程研究及開發(fā)實例[J].計算機應用研究,2006(5):154-155.
WANG Zhou-yi,LIU Ji-xing,LIU Chang-an.Research and development example of hybrid programming by VC++ and MATLAB[J].Application Research of Computers,2006 (5):154-155.
[4]謝永華,傅德勝.VC++和Matlab混合編程在圖像處理中的應用[J].計算機應用與軟件,2005,22(2):120-121.
XIE Yong-hua,F(xiàn)U De-sheng.Application of hybrid programming by VC++ and MATLAB in image processing[J].Computer Applications and Software,2005,22(2):120-121.
[5]趙志強,劉志成.VC++與Matlab混合編程技術應用分析[J].實驗技術與管理,2009,26(1):99-101.
ZHAO Zhi-qiang,LIU Zhi-cheng.Application analysis of hybrid programming by VC++ and MATLAB[J].Experimental Technology and Management,2009,26(1):99-101.
[6]楊波,亓波.精通Matlab7.0混合編程[M].北京:電子工業(yè)出版社,2006.
[7]孫慧,李莉.Visual C++和MATLAB混合編程實現(xiàn)圖像三維重建[J].微計算機信息.2007,23(18):294-296.
SUN Hui,LI Li.Implement of image three-dimensional reconstruction with hybrid programming by Visual C++ and MATLAB[J].Microcomputer Information,2007,23(18):294-296.