資源描述:
《課題:VC與Matlab混合編程.doc》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、VC與Matlab混合編程本文主要介紹VC與Matlab混合編程的兩種方法,并詳細(xì)介紹了VC向Matlab傳遞復(fù)雜數(shù)據(jù):結(jié)構(gòu)體的方法,有詳細(xì)代碼說(shuō)明。Matlab?主要面對(duì)科學(xué)計(jì)算、可視化以及交互式程序設(shè)計(jì)的高科技計(jì)算環(huán)境,但由于Matlab開(kāi)發(fā)平臺(tái)上開(kāi)發(fā)的程序不能脫離Matlab運(yùn)行環(huán)境,因而在處理一些實(shí)際應(yīng)用問(wèn)題時(shí)顯得靈活性不足,而VC++則在一定程度上能夠彌補(bǔ)這一漏洞,因此,將二者結(jié)合共用,各獻(xiàn)其長(zhǎng),可以為科研工作和工程開(kāi)發(fā)提供更為強(qiáng)大的技術(shù)支持。Matlab作為控制系統(tǒng)設(shè)計(jì)的一種通用工具,它可以很方便的和VC進(jìn)行連接。一般而言,Matlab與VC混合編程的實(shí)現(xiàn)方法有很多種,這里主要介紹
2、以下兩種:1.??VC調(diào)用Matlab?Engine的方式:MatlabEngine是一組Matlab提供的接口函數(shù),支持C/C++語(yǔ)言,MatlabEngine采用C/S(客戶(hù)機(jī)/服務(wù)器)模式,Matlab作為后臺(tái)服務(wù)器,而C/C++程序作為前臺(tái)客戶(hù)機(jī),向MatlabEngine傳遞執(zhí)行命令和數(shù)據(jù)信息,從MatlabEngine接收?qǐng)?zhí)行結(jié)果。用戶(hù)可以在前臺(tái)應(yīng)用程序中調(diào)用這些接口函數(shù),實(shí)現(xiàn)對(duì)MatlabEngine的控制。采用這種方法幾乎能利用Matlab全部功能,但是需要在機(jī)器上安裝Matlab軟件,缺點(diǎn)是執(zhí)行效率較低。下面簡(jiǎn)單介紹下這種方式的實(shí)現(xiàn)步驟:1.1API接口介紹先來(lái)介紹一組Mat
3、lab提供的引擎API接口:(僅作簡(jiǎn)單功能介紹,詳細(xì)參數(shù)說(shuō)明請(qǐng)參考Matlab幫助)Engine*engOpen(constchar*startcmd)啟動(dòng)Matlab引擎intengClose(Engine*ep)?關(guān)閉Matlab引擎int?engEvalString(Engine*ep,?constchar*string)執(zhí)行Matlab表達(dá)式mxArray*engGetArray(Engine*ep,constchar*name)獲取一個(gè)變量數(shù)組的值int?engPutArray(engine*ep,constmxArray*mp)設(shè)置一個(gè)變量數(shù)組的值intengPutVariable
4、(Engine*ep,constchar*name,constmxArray*pm)同上mxArray*engGetVariable(Engine*ep,constchar*name)獲取一個(gè)變量intengOutputBuffer(Engine*eP,char*p,intn)獲取輸出字符串?1.2???VC環(huán)境配置要想在VC集成環(huán)境下調(diào)用Matlab引擎實(shí)現(xiàn)VC和Matlab的混合編程,一般需要經(jīng)過(guò)以下幾個(gè)必要的步驟:(以下以Matlab2008a和VS2005版本為例)(1)添加include路徑:將“externinclude”(在Matlab的安裝路徑下)路勁添加到VC編譯器的in
5、clude下(2)添加lib路徑:將“externlibwin32microsoft”?(在Matlab的安裝路徑下)?路徑添加到VC編譯器的lib下(3)加載lib:需要加載至少libmx.lib、libmat.lib、libeng.lib三個(gè)庫(kù)(4)include頭文件:在要使用?engine?函數(shù)的地方包含engine.h頭文件?1.3???引擎調(diào)用接下來(lái)就可以在VC中調(diào)用Matlab引擎了,簡(jiǎn)單的示例代碼如下:#include"engine.h"#pragmacomment(lib,"libeng.lib")#pragmacomment(lib,"libmx.lib")#pra
6、gmacomment(lib,"libmat.lib")voidTestDeno(){Engine*pEng=NULL;if(!(pEng=engOpen(NULL))){printf("Openmatlabengingfail!");return;}//callEngineplotA*sin(t)+BA=2B=1mxArray*A=NULL;doubleinit=2;A=mxCreateDoubleMatrix(1,1,mxREAL);memcpy((void*)mxGetPr(A),(void*)&init,sizeof(double));engPutVariable(pEng,"A",A
7、);init=1;memcpy((void*)mxGetPr(A),(void*)&init,sizeof(double));engPutVariable(pEng,"B",A);mxDestroyArray(A);Sleep(3*60*1000);engEvalString(pEng,"t=0:0.2:7;plot(t,A*sin(t)+B);");if(NULL!=pEng){engClose