|
MATLAB的最新集成方法及其應(yīng)用--Add-in Ma tla b是 美國(guó)MathWork,公司推出的一個(gè)為科學(xué)和工程計(jì)算而專門設(shè)計(jì)的高級(jí)交互式軟件包;是一個(gè)集科學(xué)計(jì)算、圖像處理、聲音處理于一體的高度集成系統(tǒng)。它以矩陣作為基本數(shù)據(jù)結(jié)構(gòu),可大大節(jié)省編程時(shí)間,且Matlab語(yǔ)法規(guī)則簡(jiǎn)單、易于掌握、調(diào)試方便。利用Matlab可設(shè)計(jì)出功能強(qiáng)大、界面優(yōu)美、性能穩(wěn)定的高質(zhì)量程序,因而成為當(dāng)今國(guó)際上最流行的控制系統(tǒng)計(jì)算機(jī)輔助設(shè)計(jì)軟件。但Matlab程序也存在著諸多不足之處,例如:程序邊解釋邊執(zhí)行,運(yùn)算速度較慢;Matlab不適合作為通用的編程平臺(tái),即無(wú)法脫離Matlab環(huán)境運(yùn)行;其提供的控件和事件的限制,使得GUI功能較差。因此,實(shí)現(xiàn)Matlab與VC++,V B,BC,C + + BUILDER等可視化語(yǔ)言的交互,提高速度,美化界面,使程序更符合Windows的規(guī)范,有助于發(fā)揮Matlab和這些可視化語(yǔ)言的各自優(yōu)勢(shì)。
2 Matlab語(yǔ)言與VC++語(yǔ)言集成的幾 種 方 法 以 Ma tla b與VC的混合編程為例介紹幾種主要的接口方法。Matlab5 .0 以后版本自帶了C語(yǔ)言編輯器(Compiler),可將M文件轉(zhuǎn)化為CMEX或C/C+十程序M,便于實(shí)現(xiàn)VC與Matlab的混合編程。 Ma tla b與 VC集成方式有多種,主要包括: (1) M at lab程序用C或C++語(yǔ)言編寫,然后編譯成MEX文件用于Matlab的調(diào)用。在 Matlab中可調(diào)用的C或Fortran語(yǔ)言程序稱為MEX文件。Matlab提供T專門編寫MEX文件的工具,它可以把已做好的C+十源程序編譯成.m ex文件供Matlab在命令行方式下調(diào)用。Matlab解釋器可以自動(dòng)載入并執(zhí)行它。具體操作可參考MEX文件的編程規(guī)則要求。 (2) 在 V C程序中利用MatlabE ngine調(diào)用Matlab函數(shù)。Matlab引攀程序是指通過(guò)ActiceX與獨(dú)立Matlab進(jìn)程進(jìn)行通信的C/C十+或者Fortran程序。Matlab提供了一系列的例程使得別的程序可以調(diào)用它,從而把Matlab用做一個(gè)計(jì)算引擎。在運(yùn)行時(shí),引擎程序和C++程序各自作為一個(gè)進(jìn)程單獨(dú)運(yùn)行,二者之間通過(guò)進(jìn)程間的通 信機(jī)制進(jìn)行交互。 (3 )利 用 Mathtools公司推出的Mideva集成編譯開發(fā)平臺(tái),經(jīng)過(guò)簡(jiǎn)單設(shè)置后,可以將M源文件轉(zhuǎn)換為C/C++文件,然后添加到MSVC工程中?;蛘呃迷撈脚_(tái)直接生成EXE文件(啟動(dòng)Mideva,在菜單"File-Compiler to exe”中,選出需要轉(zhuǎn)換的M文件),然后在VC中通過(guò)外部函數(shù)shellexec)或winexec)調(diào)用。該方法簡(jiǎn)單方便,但僅適于VC調(diào)用Matlab實(shí)現(xiàn)圖形顯示的情況。 (4 )在 VC程序中利用MatlabC M athL ibrary或Matlab C++Math Library調(diào)用Matlab 函數(shù)。 3 VC++與Matlab混合編程的最新實(shí) 現(xiàn) 方 法 3.1 混合編程步驟 作者 使 用 一種最新、最方便的方法,即通過(guò)Matlab6 .0 A dd-in實(shí)現(xiàn)VC與Matlab的混合編程,并通過(guò)信號(hào)處理工具箱(Signal ProcessingToolbox),完成在此環(huán)境下的濾波器設(shè)計(jì)(但須先在VC中加載Matlab Add-in)。具體步驟為: (1) 啟 動(dòng) Matlab,運(yùn)行“mex-setup",按照菜單提示選取MSVC; (2) 在 M atlab環(huán)境下運(yùn)行“mbuild-setup",按提示選取MSVC; (3) 在 M atlab環(huán)境下運(yùn)行“cd(prefdir)”和"mccsavepath"; (4) 在 M SVC環(huán)境中配置MatlabA dd-in:從菜單“Tools二Customize”的“Add-ins andMacro Files”選項(xiàng)卡中,選擇“Matlab Add-in",點(diǎn)擊“Close"。此時(shí),工具欄出現(xiàn)Matlab Add-in圖標(biāo)。以后每次啟動(dòng)VC,系統(tǒng)會(huì)自動(dòng)加載Matlab Add-in;在Windows 95/98系統(tǒng)下,找到config.sys文件,添加一行:shell= c,\ C ommand.co m/e, 32768/p,完成系統(tǒng)的配置。 3.2 混合編程的具體實(shí)現(xiàn) 以創(chuàng) 建 一 個(gè)名為m州lte,的工程為例來(lái)具體驗(yàn)證。 第一 步 在 Matlab環(huán)境下編輯M文件Cz]myfilter.m 。設(shè)計(jì)一個(gè)通帶范圍為。一100H z,通帶波紋小于3 dB,阻帶為一30 dB的最小階低通濾波器。內(nèi)容如下(注意:該文件必須是一個(gè)M函數(shù),而不能是一個(gè)Script文件): fun ct ion m yf ilt er () wp = 10 0/ 50 0, w s=200/500; [n ,w n] =b ut tor d( wp,ws,3,30); [b ,a] = bu tte r(n ,w n); fre gz( b ,a, 51 2, 100 0) 第二 步 : 創(chuàng)建myfilter工程。啟動(dòng)MSVC,打開“File-New",選擇Project中的“Matlab ProjectWizard",Pr ojectN ame命名為myfilter,點(diǎn)擊Next,應(yīng)用程序類型選擇Windows ConsoleEXE,選定C++程序,其余采用歇認(rèn)設(shè)置,點(diǎn)擊"Finish",出現(xiàn)對(duì)話框要求選擇添加到工程中的M源文件,選中編輯好的myfilter.m 后,這時(shí)可看到MSVC調(diào)用MCC生成一個(gè)混合M文件和C的工程(s7。在“File View',選項(xiàng)卡中可看到添加的M文件和自動(dòng)生成的M文件及C++文件。 第三 步 : 按F7編譯后,按F5運(yùn)行,運(yùn)行結(jié)果見圖1,編譯運(yùn)行后系統(tǒng)自動(dòng)為程序生成了17個(gè)M文件,包括:bilinear.m ,buttap.m ,buttord.m ,datawrap.m ,fr eqchk.m ,fr eqz.m ,fr eqzplot.m ,subplot.m 等。且系統(tǒng)自動(dòng)生成了各cpp代碼,例如可以打開fregzplot.cpp程序代碼(有刪節(jié)): void fregzplot(mwArray h, mwArray w, mwArray s _ in0){ Mf re g zp lo t(h ,w , s - in 0) ; } voi d ml xFregzplot( intn lhs,m xArray plhs[], int nrhs, mxArray二prhs仁〕)哎 MW _ B E GI N _ M LX ( ); { mw A rra y m p rh s[ 3] ; in t i ; if ( n lhs > 0) { err or ( m w A rra y (" R un -ti meE rror: File:fr egzplotL ine:l C olumn:I T hef unction” fregzplot" was called with more than the declared number of outputs (0).”)); ) if ( n rhs > 3) { err or ( mw A rr ay ( ”R un-time Error: File: fregzplot Line; 1 Column: I The function" fregzplot" was called with more than the declared number of inputs (3)”)); } for ( i 二 O; i< 3 & 衣 i<nrhs;+ +i){ mp rh s[i ]= m wA rr ay (p rhs 仁i ].0 ); } for ( ;i < 3; + + i) { mp rh s[i ]. M a ke DI NO ; } Mf req zp lot ( m p rhs [ 0],m prhs[ 1], mprhs[2]); ) MW _ E N D _ MLX0; ) 4 結(jié)論 利用 M atlabA dd-in實(shí)現(xiàn)VC++與Matlab語(yǔ)言的集成具有以下優(yōu)點(diǎn): (1) 集 成 操作簡(jiǎn)單。即無(wú)須添加任何C/C十十代碼,即可以生成一個(gè)Matlab應(yīng)用程序(這里需要注意的是,添加到工程的MSVC文件必須是一個(gè)函數(shù)文件,而不能是一個(gè)Script文件,否則會(huì)出現(xiàn)錯(cuò)誤提示); (2) 可 以 脫離Matlab環(huán)境獨(dú)立運(yùn)行。這樣集成后的程序能夠以獨(dú)立執(zhí)行程序的形式運(yùn)行,只要事先編譯好M函數(shù),通過(guò)Matlab Add-in與VC的集成調(diào)用,完全可以脫離Matlab環(huán)境執(zhí)行程序; (3) 程 序 的改動(dòng)直接、方便。若需要改動(dòng)生成的C++代碼,可以在MSVC工作區(qū)中直接修改M文件(而不必在Matlab環(huán)境中),重新編譯即可。作為 一 種 最新的VC++與Matlab的集成方法,Matlab Add-in具有的優(yōu)越性已經(jīng)引起人們的普遍關(guān)注.當(dāng)然,目前的Matlab Add-in工具還不完善,比如還不能完全支持所有的Matlab函數(shù),且自動(dòng)生成的代碼相當(dāng)繁雜。這些問(wèn)題還需要研究工作者進(jìn)一步的努力和探素。 |
|
|
來(lái)自: daisyyouxue > 《matlab與VC/C 混合編程》