慕 巍,王若亮,李晶娣,邱 亞
(1.西安應(yīng)用光學(xué)研究所 陜西 西安 710065;2.西安飛行自動控制研究所 陜西 西安 710065)
VC++是微軟公司推出的一套面向?qū)ο蟮目梢暬删幊滔到y(tǒng)[1],是Windows平臺下構(gòu)建32位應(yīng)用程序的強(qiáng)大而又復(fù)雜的開發(fā)工具[2],但其在科學(xué)計(jì)算方面函數(shù)庫不夠豐富,讀取、顯示數(shù)據(jù)圖形不方便。Matlab是Matrix Laboratory(矩陣實(shí)驗(yàn)室)的縮寫,是由美國MathWorks公司開發(fā)的集數(shù)值分析、符號計(jì)算和圖形可視化三大基本功能于一體,功能強(qiáng)大、操作簡單的語言[3]。它包含大量高度集成的函數(shù)可供調(diào)用,是適合科學(xué)研究、工程設(shè)計(jì)等眾多學(xué)科領(lǐng)域使用的簡潔、高效的編程工具[4]。
為充分發(fā)揮這二者優(yōu)勢,利用Matlab提供的ActiveX引擎,實(shí)現(xiàn)在VC++開發(fā)的應(yīng)用程序中完全控制Matlab,使用戶輕松開發(fā)出高效、功能強(qiáng)大的應(yīng)用程序,為工程實(shí)踐和科研工作提供強(qiáng)大的技術(shù)支持。
Matlab ActiveX引擎(engine),是指一組Matlab提供的接口函數(shù)[5],支持C/C++、Fortran等語言,通過這些接口函數(shù),用戶可以在VB、Delphi、VC++等編程環(huán)境中實(shí)現(xiàn)對Matlab的控制,將Matlab作為一個操作引擎使用,使其在后臺運(yùn)行。操作Matlab引擎常用的函數(shù)及其功能如表1所示。
表1 Matlab引擎常用的函數(shù)及其功能表Tab.1 Functions of Matlab engine
通過引擎方式,應(yīng)用程序會打開一個新的Matlab進(jìn)程,將Matlab作為一個功能強(qiáng)大的和可編程的數(shù)學(xué)函數(shù)庫,調(diào)用Matlab中大量的數(shù)學(xué)計(jì)算和圖形處理函數(shù),通過控制它完成任何計(jì)算和繪圖操作。同時,引擎方式打開的Matlab進(jìn)程會在任務(wù)欄顯示自己的圖標(biāo),打開該窗口,可以觀察主程序通過引擎方式控制Matlab運(yùn)行的流程,并可在其中輸入任何Matlab命令。
在VC++編程環(huán)境下利用Matlab ActiveX引擎實(shí)現(xiàn)VC++和Matlab的混合編程,需要對VC++編譯環(huán)境和應(yīng)用程序進(jìn)行設(shè)置,具體步驟如下:
1)通過菜單 Tools/Options,打開Visual C++6.0設(shè)置屬性頁,進(jìn)入Directories選項(xiàng)卡,在Show Directories for下拉列表中選擇 Include Files,添加路徑:E:MATLAB7externinclude(假定Matlab的安裝目錄為E:MATLAB7),如圖1所示。
圖1 VC++編譯環(huán)境設(shè)置步驟1Fig.1 Step 1 of setting VC++compiling environment
2)再通過Show Directories for下拉列表中選擇 Library Files,添加路徑:E:MATLAB7externlibwin32Microsoftmsvc70,如圖2所示。
圖2 VC++編譯環(huán)境設(shè)置步驟2Fig.2 Step 2 of setting VC++compiling environment
3)通過菜單 Projects/Settings,進(jìn)入 Link頁面,在 Object/Library Modules框中,添加庫文件名:libmx.lib,libmat.lib,libeng.lib,如圖3所示。
4)在使用Matlab引擎函數(shù)的程序頭文件中添加如下代碼:
圖3 VC++編譯環(huán)境設(shè)置步驟3Fig.3 Step 3 of setting VC++compiling environment
5)在應(yīng)用程序中添加調(diào)用Matlab引擎的程序代碼:
if(!(ep=engOpen(NULL))) //測試是否啟動 Matlab 引擎成功
以上步驟是對VC與Matlab混合編程的編譯環(huán)境和應(yīng)用程序進(jìn)行設(shè)置,在完成了以上基本步驟后就可以利用Matlab引擎庫函數(shù)engEvalString來調(diào)用Matlab的內(nèi)建函數(shù)了。以上步驟 1)、2)只需設(shè)置一次,而步驟 3)、4)、5)對每個工程都要單獨(dú)設(shè)定。
對大部分軟件研發(fā)人員來說利用VC++編程方便、高效,但是要顯示數(shù)據(jù)圖形就不那么容易了,這時可利用Matlab ActiveX引擎輔助畫圖做數(shù)據(jù)分析。下面通過一個具體的應(yīng)用實(shí)例來說明如何實(shí)現(xiàn)VC++與Matlab ActiveX引擎的混合編程。程序的主要功能是在VC++中對數(shù)組x計(jì)算函數(shù)值y=5sinx,然后調(diào)用Matlab繪制函數(shù)y對x的曲線。
首先,利用VC++6.0的MFC建立一個基于對話框的應(yīng)用程序,如圖4,添加相應(yīng)按扭,并為其添加相應(yīng)的成員函數(shù)。
圖4 ActiveX引擎測試程序界面Fig.4 Interface of ActiveX engine of test program
其次,根據(jù)前面介紹的ActiveX引擎實(shí)現(xiàn)VC++和Matlab混合編程的實(shí)現(xiàn)步驟,為程序設(shè)置相應(yīng)的編譯環(huán)境并添加連接庫函數(shù)。
然后,調(diào)用Matlab的內(nèi)建函數(shù)和命令,主要編寫程序代碼如下:
1)在“啟動引擎”按扭的成員函數(shù)中,添加如下代碼:
if(!(ep=engOpen(NULL))) //測試是否啟動 Matlab 引擎成功
2)在“關(guān)閉引擎”按扭的成員函數(shù)中,添加代碼:
engClose(ep);//關(guān)閉 Matlab 引擎
3)在“測試”按扭的成員函數(shù)中,添加如下代碼:
//定義 mxArray數(shù)組 xx,yy,為 1行,100列的實(shí)數(shù)數(shù)組
mxArray*xx=mxCreateDoubleMatrix(1,100,mxREAL);
mxArray*yy=mxCreateDoubleMatrix(1,100,mxREAL);
memcpy(mxGetPr(xx),x,100*sizeof(double));//將 x 復(fù)制到mxarray數(shù)組xx中
memcpy(mxGetPr(yy),y,100*sizeof(double));//將 y 復(fù)制到mxarray數(shù)組yy中
engPutVariable(ep,“xx”,xx);//將 mxArray 數(shù)組 xx 寫入到Matlab,命名為xx
engPutVariable(ep,“yy”,yy);//將 mxArray 數(shù)組 yy 寫入到Matlab,命名為yy
engEvalString(ep,“plot(xx,yy);”);//向 Matlab 引 擎 發(fā)送畫圖命令
engEvalString(ep,“xlabel(‘x’);”);//向圖形窗口添加橫坐標(biāo)標(biāo)注
engEvalString(ep,“ylabel(‘y=5*sin(x)’);”);//向圖形窗口添加縱坐標(biāo)標(biāo)注
編譯運(yùn)行,先點(diǎn)擊“啟動引擎”按鈕,Matlab引擎啟動后,再點(diǎn)擊“測試”按鈕,就可以得到如圖5所示的結(jié)果。
該實(shí)例是利用ActiveX引擎實(shí)現(xiàn)VC++與Matlab混合編程的一個簡單應(yīng)用,在實(shí)際的數(shù)值計(jì)算、信號處理、控制系統(tǒng)開發(fā)等工程應(yīng)用中,可以很好的利用基于ActiveX引擎的VC++和Matlab的混合編程技術(shù),簡化應(yīng)用程序的開發(fā)過程,縮短開發(fā)周期。
圖5 ActiveX引擎測試曲線Fig.5 Test curve of ActiveX engine
本文詳細(xì)介紹了在VC++編譯環(huán)境下利用Matlab提供的ActiveX引擎實(shí)現(xiàn)應(yīng)用系統(tǒng)設(shè)計(jì)和分析的具體方法,并通過一個具體應(yīng)用實(shí)例介紹了VC++如何利用Matlab ActiveX引擎進(jìn)行輔助畫圖和數(shù)據(jù)分析。
Matlab不但具有強(qiáng)大的數(shù)值計(jì)算和符號計(jì)算能力,而且為不同領(lǐng)域提供了豐富的工具箱[5]。而VC++在面向?qū)ο蟮膽?yīng)用程序開發(fā)方面功能強(qiáng)大、靈活性好[6]。利用Matlab提供的ActiveX引擎,實(shí)現(xiàn)了VC++和Matlab的混合編程,能夠發(fā)揮各自優(yōu)勢,為用戶提供了一個友好的編程接口,縮短了工程應(yīng)用軟件的開發(fā)周期,同時也提高了程序的運(yùn)行效率。
[1]姚領(lǐng)田.精通MFC程序設(shè)計(jì)[M].北京:人民郵電出版社,2006.
[2]謝佩軍,計(jì)時鳴,張利.VC++與MATLAB混合編程的探討[J].計(jì)算機(jī)應(yīng)用與軟件,2006(2):128-130.XIE Pei-jun,JI Shi-ming,ZHANG Li.Research of combined programming of VC++and MATLAB[J].Computer Applications and Software,2006(2):128-130.
[3]張靜.MATLAB在控制系統(tǒng)中的應(yīng)用[M].北京:電子工業(yè)出版社,2007.
[4]王沫然.MATLAB 6.0與科學(xué)計(jì)算[M].北京:電子工業(yè)出版社,2001.
[5]劉志儉.MATLAB應(yīng)用程序接口用戶指南[M].北京:科學(xué)出版社,2000.
[6]彭猛.VC++與MATLAB混合編程的研究 [J].科技咨詢導(dǎo)報,2007(8):21-21.PENG Meng.Research on hybrid programming of VC++and Matlab[J].Science and Technology Consulting Herald,2007(8):21-21.