慕 巍,王若亮,李晶娣,邱 亞
(1.西安應用光學研究所 陜西 西安 710065;2.西安飛行自動控制研究所 陜西 西安 710065)
VC++是微軟公司推出的一套面向對象的可視化集成編程系統[1],是Windows平臺下構建32位應用程序的強大而又復雜的開發工具[2],但其在科學計算方面函數庫不夠豐富,讀取、顯示數據圖形不方便。Matlab是Matrix Laboratory(矩陣實驗室)的縮寫,是由美國MathWorks公司開發的集數值分析、符號計算和圖形可視化三大基本功能于一體,功能強大、操作簡單的語言[3]。它包含大量高度集成的函數可供調用,是適合科學研究、工程設計等眾多學科領域使用的簡潔、高效的編程工具[4]。
為充分發揮這二者優勢,利用Matlab提供的ActiveX引擎,實現在VC++開發的應用程序中完全控制Matlab,使用戶輕松開發出高效、功能強大的應用程序,為工程實踐和科研工作提供強大的技術支持。
Matlab ActiveX引擎(engine),是指一組Matlab提供的接口函數[5],支持C/C++、Fortran等語言,通過這些接口函數,用戶可以在VB、Delphi、VC++等編程環境中實現對Matlab的控制,將Matlab作為一個操作引擎使用,使其在后臺運行。操作Matlab引擎常用的函數及其功能如表1所示。

表1 Matlab引擎常用的函數及其功能表Tab.1 Functions of Matlab engine
通過引擎方式,應用程序會打開一個新的Matlab進程,將Matlab作為一個功能強大的和可編程的數學函數庫,調用Matlab中大量的數學計算和圖形處理函數,通過控制它完成任何計算和繪圖操作。同時,引擎方式打開的Matlab進程會在任務欄顯示自己的圖標,打開該窗口,可以觀察主程序通過引擎方式控制Matlab運行的流程,并可在其中輸入任何Matlab命令。
在VC++編程環境下利用Matlab ActiveX引擎實現VC++和Matlab的混合編程,需要對VC++編譯環境和應用程序進行設置,具體步驟如下:
1)通過菜單 Tools/Options,打開Visual C++6.0設置屬性頁,進入Directories選項卡,在Show Directories for下拉列表中選擇 Include Files,添加路徑:E:MATLAB7externinclude(假定Matlab的安裝目錄為E:MATLAB7),如圖1所示。

圖1 VC++編譯環境設置步驟1Fig.1 Step 1 of setting VC++compiling environment
2)再通過Show Directories for下拉列表中選擇 Library Files,添加路徑:E:MATLAB7externlibwin32Microsoftmsvc70,如圖2所示。

圖2 VC++編譯環境設置步驟2Fig.2 Step 2 of setting VC++compiling environment
3)通過菜單 Projects/Settings,進入 Link頁面,在 Object/Library Modules框中,添加庫文件名:libmx.lib,libmat.lib,libeng.lib,如圖3所示。
4)在使用Matlab引擎函數的程序頭文件中添加如下代碼:

圖3 VC++編譯環境設置步驟3Fig.3 Step 3 of setting VC++compiling environment

5)在應用程序中添加調用Matlab引擎的程序代碼:
if(!(ep=engOpen(NULL))) //測試是否啟動 Matlab 引擎成功

以上步驟是對VC與Matlab混合編程的編譯環境和應用程序進行設置,在完成了以上基本步驟后就可以利用Matlab引擎庫函數engEvalString來調用Matlab的內建函數了。以上步驟 1)、2)只需設置一次,而步驟 3)、4)、5)對每個工程都要單獨設定。
對大部分軟件研發人員來說利用VC++編程方便、高效,但是要顯示數據圖形就不那么容易了,這時可利用Matlab ActiveX引擎輔助畫圖做數據分析。下面通過一個具體的應用實例來說明如何實現VC++與Matlab ActiveX引擎的混合編程。程序的主要功能是在VC++中對數組x計算函數值y=5sinx,然后調用Matlab繪制函數y對x的曲線。
首先,利用VC++6.0的MFC建立一個基于對話框的應用程序,如圖4,添加相應按扭,并為其添加相應的成員函數。

圖4 ActiveX引擎測試程序界面Fig.4 Interface of ActiveX engine of test program
其次,根據前面介紹的ActiveX引擎實現VC++和Matlab混合編程的實現步驟,為程序設置相應的編譯環境并添加連接庫函數。
然后,調用Matlab的內建函數和命令,主要編寫程序代碼如下:
1)在“啟動引擎”按扭的成員函數中,添加如下代碼:
if(!(ep=engOpen(NULL))) //測試是否啟動 Matlab 引擎成功

2)在“關閉引擎”按扭的成員函數中,添加代碼:
engClose(ep);//關閉 Matlab 引擎
3)在“測試”按扭的成員函數中,添加如下代碼:

//定義 mxArray數組 xx,yy,為 1行,100列的實數數組
mxArray*xx=mxCreateDoubleMatrix(1,100,mxREAL);
mxArray*yy=mxCreateDoubleMatrix(1,100,mxREAL);
memcpy(mxGetPr(xx),x,100*sizeof(double));//將 x 復制到mxarray數組xx中
memcpy(mxGetPr(yy),y,100*sizeof(double));//將 y 復制到mxarray數組yy中
engPutVariable(ep,“xx”,xx);//將 mxArray 數組 xx 寫入到Matlab,命名為xx
engPutVariable(ep,“yy”,yy);//將 mxArray 數組 yy 寫入到Matlab,命名為yy
engEvalString(ep,“plot(xx,yy);”);//向 Matlab 引 擎 發送畫圖命令
engEvalString(ep,“xlabel(‘x’);”);//向圖形窗口添加橫坐標標注
engEvalString(ep,“ylabel(‘y=5*sin(x)’);”);//向圖形窗口添加縱坐標標注

編譯運行,先點擊“啟動引擎”按鈕,Matlab引擎啟動后,再點擊“測試”按鈕,就可以得到如圖5所示的結果。
該實例是利用ActiveX引擎實現VC++與Matlab混合編程的一個簡單應用,在實際的數值計算、信號處理、控制系統開發等工程應用中,可以很好的利用基于ActiveX引擎的VC++和Matlab的混合編程技術,簡化應用程序的開發過程,縮短開發周期。

圖5 ActiveX引擎測試曲線Fig.5 Test curve of ActiveX engine
本文詳細介紹了在VC++編譯環境下利用Matlab提供的ActiveX引擎實現應用系統設計和分析的具體方法,并通過一個具體應用實例介紹了VC++如何利用Matlab ActiveX引擎進行輔助畫圖和數據分析。
Matlab不但具有強大的數值計算和符號計算能力,而且為不同領域提供了豐富的工具箱[5]。而VC++在面向對象的應用程序開發方面功能強大、靈活性好[6]。利用Matlab提供的ActiveX引擎,實現了VC++和Matlab的混合編程,能夠發揮各自優勢,為用戶提供了一個友好的編程接口,縮短了工程應用軟件的開發周期,同時也提高了程序的運行效率。
[1]姚領田.精通MFC程序設計[M].北京:人民郵電出版社,2006.
[2]謝佩軍,計時鳴,張利.VC++與MATLAB混合編程的探討[J].計算機應用與軟件,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在控制系統中的應用[M].北京:電子工業出版社,2007.
[4]王沫然.MATLAB 6.0與科學計算[M].北京:電子工業出版社,2001.
[5]劉志儉.MATLAB應用程序接口用戶指南[M].北京:科學出版社,2000.
[6]彭猛.VC++與MATLAB混合編程的研究 [J].科技咨詢導報,2007(8):21-21.PENG Meng.Research on hybrid programming of VC++and Matlab[J].Science and Technology Consulting Herald,2007(8):21-21.