VC 與Matlab混合編程之引擎操作詳解_第1頁(yè)
VC 與Matlab混合編程之引擎操作詳解_第2頁(yè)
VC 與Matlab混合編程之引擎操作詳解_第3頁(yè)
VC 與Matlab混合編程之引擎操作詳解_第4頁(yè)
VC 與Matlab混合編程之引擎操作詳解_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、VC+與Matlab混合編程之引擎操作詳解課題需要生成多通道的電壓信號(hào),即通過(guò)激光接收器轉(zhuǎn)換而成的電信號(hào),然后通過(guò)數(shù)據(jù)采集卡進(jìn)行向外傳輸,故想到在傳輸之前可以將數(shù)據(jù)以波形的方式顯示出來(lái),由于在vc中畫(huà)圖還是比較麻煩的,所以想到用vc調(diào)用matlab引擎然后畫(huà)圖,上網(wǎng)一搜這方面的信息還是很多的,不過(guò)不好的地方是不能脫離matlab.下面轉(zhuǎn)載些相關(guān)知識(shí),以饗大家_Visual C+是當(dāng)前主流的應(yīng)用程序開(kāi)發(fā)環(huán)境之一,開(kāi)發(fā)環(huán)境強(qiáng)大,開(kāi)發(fā)的程序執(zhí)行速度快。但在科學(xué)計(jì)算方面函數(shù)庫(kù)顯得不夠豐富、讀取、顯示數(shù)據(jù)圖形不方便。 Matlab是一款將數(shù)值分析、矩陣計(jì)算、信號(hào)處理和圖形顯示結(jié)合在一起,包含大量高度集成

2、的函數(shù)可供調(diào)用,適合科學(xué)研究、工程設(shè)計(jì)等眾多學(xué)科領(lǐng)域使用的一種簡(jiǎn)潔、高效的編程工具。不過(guò)由于Matlab使用的是解釋性語(yǔ)言,大大限制了它的執(zhí)行速度和應(yīng)用場(chǎng)合?;赩C和Matlab混合編程是很多熟悉VC +編程而又需要進(jìn)行科學(xué)計(jì)算、數(shù)據(jù)仿真的科研人員常用的一種方式,其中最簡(jiǎn)單也最直接的方法就是調(diào)用Matlab引擎。本文以下部分將詳細(xì)介紹通過(guò)VC +6.0調(diào)用Matlab6.5引擎來(lái)達(dá)到VC+與Matlab數(shù)據(jù)共享編程的方法。1. 什么是Matlab引擎所謂Matlab引擎(engine),是指一組Matlab提供的接口函數(shù),支持C/C+、Fortran等語(yǔ)言,通過(guò)這些接口函數(shù),用戶(hù)可以在其它編

3、程環(huán)境中實(shí)現(xiàn)對(duì)Matlab的控制??梢灾饕δ苡校?打開(kāi)/關(guān)閉一個(gè)Matlab對(duì)話(huà); 向Matlab環(huán)境發(fā)送命令字符串; 從Matlab環(huán)境中讀取數(shù)據(jù); 向Matlab環(huán)境中寫(xiě)入數(shù)據(jù)。與其它各種接口相比,引擎所提供的Matlab功能支持是最全面的。通過(guò)引擎方式,應(yīng)用程序會(huì)打開(kāi)一個(gè)新的Matlab進(jìn)程,可以控制它完成任何計(jì)算和繪圖操作。對(duì)所有的數(shù)據(jù)結(jié)構(gòu)提供100%的支持。同時(shí),引擎方式打開(kāi)的Matlab進(jìn)程會(huì)在任務(wù)欄顯示自己的圖標(biāo),打開(kāi)該窗口,可以觀(guān)察主程序通過(guò) engine方式控制Matlab運(yùn)行的流程,并可在其中輸入任何Matlab命令。實(shí)際上,通過(guò)引擎方式建立的對(duì)話(huà),是將Matlab以Ac

4、tiveX控件方式啟動(dòng)的。在Matlab初次安裝時(shí),會(huì)自動(dòng)執(zhí)行一次:matlab /regserver將自己在系統(tǒng)的控件庫(kù)中注冊(cè)。如果因?yàn)樘厥庠?,無(wú)法打開(kāi)Matlab引擎,可以在Dos命令提示符后執(zhí)行上述命令,重新注冊(cè)。2. 配置編譯器要在VC中成功編譯Matlab引擎程序,必須包含引擎頭文件engine.h并引入Matlab對(duì)應(yīng)的庫(kù)文件libmx.lib、libmat.lib、libeng.lib。具體的說(shuō),打開(kāi)一個(gè)工程后,做如下設(shè)置(以VC6為例):1) 通過(guò)菜單工具/選項(xiàng),打開(kāi)設(shè)置屬性頁(yè),進(jìn)入Directories頁(yè)面,在目錄下拉列表框中選擇Include files,添加路徑:&qu

5、ot;C:matlabexterninclude"(假定matlab安裝在C:matlab目錄)。2) 選擇Library files,添加路徑:C:matlabexternlibwin32microsoftmsvc60。3) 通過(guò)菜單工程/設(shè)置,打開(kāi)工程設(shè)置屬性頁(yè),進(jìn)入Link頁(yè)面,在Object/library modules編輯框中,添加文件名libmx.lib libmat.lib libeng.lib。以上步驟1)、2)只需設(shè)置一次,而步驟3)對(duì)每個(gè)工程都要單獨(dú)設(shè)定,對(duì)于其它C+編譯器如Borland C+ builder,設(shè)置大體相同,不再贅述。3. 引擎API詳解在調(diào)用

6、Matlab引擎之前,首先應(yīng)在相關(guān)文件中加入一行:#include "enging.h",該文件包含了引擎API函數(shù)的說(shuō)明和所需數(shù)據(jù)結(jié)構(gòu)的定義??梢栽赩C中調(diào)用的引擎函數(shù)分別如下:3.1 引擎的打開(kāi)和關(guān)閉engOpen打開(kāi)Matlab engine函數(shù)聲明:Engine *engOpen(const char *startcmd);參數(shù)startcmd是用來(lái)啟動(dòng)Matlab引擎的字符串參數(shù),在Windows操作系統(tǒng)中只能為NULL。函數(shù)返回值是一個(gè)Engine類(lèi)型的指針,它是在engine.h中定義的engine數(shù)據(jù)結(jié)構(gòu)。EngClose關(guān)閉Matlab 引擎函數(shù)聲明:in

7、t engClose(Engine *ep);參數(shù)ep代表要被關(guān)閉的引擎指針。函數(shù)返回值為0表示關(guān)閉成功,返回1表示發(fā)生錯(cuò)誤。例如,通常用來(lái)打開(kāi)/關(guān)閉Matlab引擎的代碼如下:Engine *ep; /定義Matlab引擎指針。if (!(ep=engOpen(NULL) /測(cè)試是否啟動(dòng)Matlab引擎成功。MessageBox("Can't start Matlab engine!" );exit(1);. engClose(ep); /關(guān)閉Matlab引擎。3.2 向Matlab發(fā)送命令字符串engEvalString發(fā)送命令讓Matlab執(zhí)行。函數(shù)聲明:in

8、t engEvalString(Engine *ep, Const char *string);參數(shù)ep為函數(shù)engOpen返回的引擎指針,字符串string為要matlab執(zhí)行的命令。函數(shù)返回值為0表示成功執(zhí)行,返回1說(shuō)明執(zhí)行失?。ㄈ缑畈荒鼙籑atlab正確解釋或Matlab引擎已經(jīng)關(guān)閉了)。3.3 獲取Matlab命令窗口的輸出要在VC中獲得函數(shù)engEvalString發(fā)送的命令字符串被Matlab執(zhí)行后在matlab窗口中的輸出,可以調(diào)用engOUtputBuffer函數(shù)。函數(shù)聲明:int engOutputBuffer(Engine *ep, char *p, int n);參數(shù)e

9、p為Matlab引擎指針,p為用來(lái)保存輸出結(jié)構(gòu)的緩沖區(qū),n為最大保存的字符個(gè)數(shù),通常就是緩沖區(qū)p的大小。該函數(shù)執(zhí)行后,接下來(lái)的 engEvalString函數(shù)所引起的命令行輸出結(jié)果會(huì)在緩沖區(qū)p中保存。如果要停止保存,只需調(diào)用代碼:engOutputBuffer(ep, NULL, 0)。3.4 讀寫(xiě)Matlab數(shù)據(jù)3.4.1從Matlab引擎工作空間中獲取變量。mxArray *engGetVariable(Engine *ep, const char *name);參數(shù)ep為打開(kāi)的Matlab引擎指針,name為以字符串形式指定的數(shù)組名。函數(shù)返回值是指向name數(shù)組的指針,類(lèi)型為mxArra

10、y*(mxArray數(shù)據(jù)類(lèi)型在本文第4節(jié)詳細(xì)簡(jiǎn)介)。3.4.2 向Matlab引擎工作空間寫(xiě)入變量。int engPutVariable(Engine *ep, const char *name, const mxArray *mp);參數(shù)ep為打開(kāi)的Matlab引擎指針,mp為指向被寫(xiě)入變量的指針,name為變量寫(xiě)入后在Matlab引擎工作空間中的變量名。函數(shù)返回值為0表示寫(xiě)入變量成功,返回值為1表示發(fā)生錯(cuò)誤。3.5 調(diào)用引擎時(shí)顯示/隱藏Matlab主窗口默認(rèn)情況下,以engine方式調(diào)用Matlab的時(shí)候,會(huì)打開(kāi)Matlab主窗口,可在其中隨意操作。但有時(shí)也會(huì)干擾應(yīng)用程序的運(yùn)行,可用以下設(shè)

11、置是否顯示該窗口。int engSetVisible(Engine *ep, bool value);參數(shù)ep為打開(kāi)的Matlab引擎指針,value為是否顯示的標(biāo)志,取值true(或1)表示顯示Matlab窗口,取值false(或0)表示隱藏Matlab窗口。函數(shù)返回值為0表示設(shè)置成功,為1表示有錯(cuò)誤發(fā)生。要獲得當(dāng)前Matlab窗口的顯示/隱藏情況,可以調(diào)用函數(shù):int engGetVisible(Engine *ep, bool *value);參數(shù)ep為打開(kāi)的Matlab引擎指針,Value為用來(lái)保存顯示/隱藏情況的變量(采用指針?lè)绞絺鬟f)。函數(shù)返回值為0表示獲取成功,為1表示有錯(cuò)誤發(fā)生

12、。4. 數(shù)據(jù)類(lèi)型mxArray的操作在上節(jié)的Matlab引擎函數(shù)中,所有與變量有關(guān)的數(shù)據(jù)類(lèi)型都是 mxArray類(lèi)型。數(shù)據(jù)結(jié)構(gòu)mxArray以及大量的mx開(kāi)頭的函數(shù),廣泛用于Matlab 引擎程序和Matlab C數(shù)學(xué)庫(kù)中。mxArray是一種很復(fù)雜的數(shù)據(jù)結(jié)構(gòu),與Matlab中的array相對(duì)應(yīng),我們只需熟悉Matlab的array類(lèi)型和幾個(gè)常用的 mxArray函數(shù)即可。在VC中,所有和Matlab的數(shù)據(jù)交互都是通過(guò)mxArray來(lái)實(shí)現(xiàn)的,在使用mxArray類(lèi)型的程序中,應(yīng)包含頭文件matrix.h,不過(guò)在引擎程序中,一般會(huì)包含頭文件engine.h,該文件里面已經(jīng)包含了matrix.h,

13、因此無(wú)需重復(fù)包含。4.1 創(chuàng)建和清除mxArray型數(shù)據(jù)Matlab有很多種變量類(lèi)型,對(duì)應(yīng)于每種類(lèi)型,基本上都有一個(gè)函數(shù)用于創(chuàng)建,但它們都有相同的數(shù)據(jù)結(jié)構(gòu),就是mxArray。數(shù)組的建立采用mxCreatexxx形式的函數(shù),例如新建一個(gè)double類(lèi)型數(shù)組,可用函數(shù)mxCreateDoubleMatrix,函數(shù)形式如下:mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);參數(shù)m和n為矩陣的函數(shù)和列數(shù)。ComplexFlag為常數(shù),用來(lái)區(qū)分矩陣中元素是實(shí)數(shù)還是復(fù)數(shù),取值分別為mxREAL和mxCOMPLEX。

14、例如,創(chuàng)建一個(gè)3行5列的二維實(shí)數(shù)數(shù)組,可用如下語(yǔ)句:mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL);對(duì)應(yīng)的,要?jiǎng)h除一個(gè)數(shù)組mxDestroyArray,該函數(shù)聲明如下:void mxDestroyArray(mxArray *array_ptr);參數(shù)array_ptr為要?jiǎng)h除的數(shù)組指針。例如,要?jiǎng)h除上面創(chuàng)建的數(shù)組T,可用如下語(yǔ)句:mxDestroyArray(T);類(lèi)似的創(chuàng)建函數(shù)還有:mxArray *mxCreateString(const char *str);創(chuàng)建一個(gè)字符串類(lèi)型并初始化為str字符串。一般的在VC與Matlab交互中,以上

15、兩種類(lèi)型就夠了,其它類(lèi)型數(shù)組的創(chuàng)建這里不再介紹。4.2 管理mxArray數(shù)據(jù)類(lèi)型4.2.1 管理mxArray數(shù)據(jù)大小要獲得mxArray數(shù)組每一維上元素的個(gè)數(shù),可以用mxGetM和mxGetN函數(shù)。其中mxGetM用來(lái)獲得數(shù)組第一維的元素個(gè)數(shù),對(duì)于矩陣來(lái)說(shuō)就是行數(shù)。int mxGetM(const mxArray *array_ptr); /返回array_ptr對(duì)應(yīng)數(shù)組第一維的元素個(gè)數(shù)(行數(shù))int mxGetN(const mxArray *array_ptr); /返回array_ptr對(duì)應(yīng)數(shù)組其它維的元素個(gè)數(shù),對(duì)于矩陣來(lái)說(shuō)是列數(shù)。對(duì)于多維數(shù)組來(lái)說(shuō)是從第2維到最后一維的各維元素個(gè)數(shù)的

16、乘積。要獲得某一特定維的元素個(gè)數(shù),則要用函數(shù):const int *mxGetDimensions(const mxArray *array_ptr);該函數(shù)返回array_ptr各維的元素個(gè)數(shù)保存在一個(gè)int數(shù)組中返回。對(duì)于常用的矩陣來(lái)說(shuō),用mxGetM和mxGetN兩個(gè)函數(shù)就可以了。另外還可以通過(guò)mxGetNumberOfDimensions來(lái)獲得數(shù)組的總的維數(shù),用mxSetM、mxSetN設(shè)置矩陣的行數(shù)和列數(shù),函數(shù)說(shuō)明如下:int mxGetNumberOfDimensions(const mxArray *array_ptr); /返回?cái)?shù)組的維數(shù)void mxSetM(mxArray

17、*array_ptr, int m); /設(shè)置數(shù)組為m行void mxSetN(mxArray *array_ptr, int n); /設(shè)置數(shù)組為n列4.2.2 判斷mxArray數(shù)組類(lèi)型在對(duì)mxArray類(lèi)型的變量進(jìn)行操作之前,可以驗(yàn)證以下其中的數(shù)組的數(shù)據(jù)類(lèi)型,比如是否為double數(shù)組、整數(shù)、字符串、邏輯值等,以及是否為某種結(jié)構(gòu)、類(lèi)、或者是特殊類(lèi)型,比如是否為空數(shù)組,是否為inf、NaN等。常見(jiàn)的判斷函數(shù)有:bool mxIsDouble(const mxArray *array_ptr);bool mxIsComplex(const mxArray *array_ptr);bool m

18、xIsChar(const mxArray *array_ptr);bool mxIsEmpty(const mxArray *array_ptr);bool mxIsInf(double value); 這些函數(shù)比較簡(jiǎn)單,意義自明,不再解釋。4.2.3 管理mxArray數(shù)組的數(shù)據(jù)對(duì)于常用的double類(lèi)型的數(shù)組,可以用mxGetPr和mxGetPi兩個(gè)函數(shù)分別獲得其實(shí)部和虛部的數(shù)據(jù)指針,這兩個(gè)函數(shù)的聲明如下:double *mxGetPr(const mxArray *array_ptr); /返回?cái)?shù)組array_ptr的實(shí)部指針double *mxGetPi(const mxArray

19、*array_ptr); /返回?cái)?shù)組array_ptr的虛部指針這樣,就可以通過(guò)獲得的指針對(duì)mxArray類(lèi)型的數(shù)組中的數(shù)據(jù)進(jìn)行讀寫(xiě)操作。例如可以用函數(shù)engGetVariable從Matlab工作空間讀入 mxArray類(lèi)型的數(shù)組,然后用mxGetPr和mxGetPi獲得數(shù)據(jù)指針,對(duì)并其中的數(shù)據(jù)進(jìn)行處理,最后調(diào)用engPutVariable函數(shù)將修改后的數(shù)組重新寫(xiě)入到Matlab工作空間。具體實(shí)現(xiàn)見(jiàn)第5節(jié)程序?qū)嵗?. 程序?qū)嵗龑?duì)大部分軟件研發(fā)人員來(lái)說(shuō)利用VC編程方便、高效,但是要顯示數(shù)據(jù)圖形就不那么容易了,這時(shí)候不防借助Matlab引擎輔助畫(huà)圖做數(shù)據(jù)分析。下面通過(guò)實(shí)例演示如何利用VC調(diào)用M

20、atlab繪圖,程序的主要功能是在VC中對(duì)數(shù)組x計(jì)算函數(shù)值ysin (x) ±log(x),然后調(diào)用Matlab繪制y對(duì)x的圖形。在VC中新建工程,編寫(xiě)代碼如下:#include <iostream>#include <math.h>#include "engine.h"using namespace std;void main()const int N = 50;double xN,yN;int j = 1;for (int i=0; i<N; i+) /計(jì)算數(shù)組x和yxi = (i+1);yi = sin(xi) + j * lo

21、g(xi); /產(chǎn)生之間的隨機(jī)數(shù)賦給xxi;j *= -1;Engine *ep; /定義Matlab引擎指針。if (!(ep=engOpen(NULL) /測(cè)試是否啟動(dòng)Matlab引擎成功。cout <<"Can't start Matlab engine!" <<endl;exit(1);/定義mxArray,為行,N列的實(shí)數(shù)數(shù)組。mxArray *xx = mxCreateDoubleMatrix(1,N, mxREAL);mxArray *yy = mxCreateDoubleMatrix(1,N, mxREAL); /同上。memcpy(mxGetPr(xx), x, N*sizeof(double); /將數(shù)組x復(fù)制到mxarray數(shù)組xx中。memcpy(mxGetPr(yy), y, N*sizeof(double); /將數(shù)組y復(fù)制到mxarray數(shù)組yy中。engPutVariable(ep, "xx",xx); /將mxArray數(shù)組xx寫(xiě)入到Matlab工作空

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論