版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Matlab中mcc, mbuild和mex命令詳解MATLAB編譯及接口Matlab的 HYPERLINK /leixiaohua1020/article/details/38318517 l t0 一 mcc命令 HYPERLINK /leixiaohua1020/article/details/38318517 l t1 二 mex命令 HYPERLINK /leixiaohua1020/article/details/38318517 l t2 三 mbuild命令mcc命令將m文件轉(zhuǎn)換成C/C+文件和相應(yīng)的MEX包裹文件(需要Matlab編譯器)和exe文件,并在特定條件下可以自動(dòng)調(diào)
2、用mbuild或者mex。Mex命令將入口函數(shù)為mexfunction()的C/C+文件編譯成MEX(DLL)文件(需要C/C+編譯器)。Mbuild命令將入口函數(shù)為main()的C/C+文件生成可獨(dú)立運(yùn)行的C應(yīng)用程序(需要C/C+編譯器)。對(duì)于64位的Windows平臺(tái),MATLAB沒有現(xiàn)成的C編譯器。需要免費(fèi)下載Microsoft Windows SDK編譯器。Microsoft Windows SDK for Windows 7 and .NET Framework 4下載地址:(需要聯(lián)網(wǎng)安裝) HYPERLINK /en-us/download/details.aspx?id=8279
3、 /en-us/download/details.aspx?id=8279安裝前一定要卸載Microsoft Visual C+ 2010 x86 Redistributable - 10.0.30319以上版本的C+運(yùn)行庫,裝完SDK7.1后需要安裝VC-Compiler-KB2519277補(bǔ)?。?HYPERLINK /zh-cn/download/details.aspx?id=4422 /zh-cn/download/details.aspx?id=4422在使用mcc, mbuild和mex命令之前,首先要配置MATLAB使用Windows SDK進(jìn)行C/C+語言編譯,配置命令如下:m
4、ex -setupmbuild -setup配置命令運(yùn)行結(jié)果: mex -setupMEX 配置為使用 Microsoft Visual C+ 2012 (C) 以進(jìn)行 C 語言編譯。警告: MATLAB C 和 Fortran API 已更改,現(xiàn)可支持包含 232-1 個(gè)以上元素的 MATLAB 變量。不久以后,您需要更新代碼以利用新的 API。您可以在以下網(wǎng)址找到相關(guān)詳細(xì)信息:/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html。要選擇不同的 C 編譯器,請(qǐng)從以下選項(xiàng)中選擇一種命令:Microsoft
5、 Visual C+ 2012 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptsmsvc2012.xml CMicrosoft Windows SDK 7.1 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptswinsdk-7.1_c.xml C要選擇不同的語言,請(qǐng)從以下選項(xiàng)中選擇一種命令: mex -setup C+ mex -setup FORTRAN mbuild -setupMBUILD 配置為使用 Microsoft Visual C+ 2012 (C)
6、以進(jìn)行 C 語言編譯。要選擇不同的 C 編譯器,請(qǐng)從以下選項(xiàng)中選擇一種命令:Microsoft Visual C+ 2012 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptsmsvc2012.xml C -client MBUILDMicrosoft Windows SDK 7.1 (C) mex -setup:C:Program FilesMATLABR2015bbinwin64mexoptswinsdk-7.1_c.xml C -client MBUILD要選擇不同的語言,請(qǐng)從以下選項(xiàng)中選擇一種命令:mex -setup C
7、+ -client MBUILD mex -setup FORTRAN -client MBUILD注釋:API(Application Programming Interface,應(yīng)用程序編程接口)是一些預(yù)先定義的函數(shù),目的是提供應(yīng)用程序與開發(fā)人員基于某軟件或硬件得以訪問一組例程的能力,而又無需訪問源碼,或理解內(nèi)部工作機(jī)制的細(xì)節(jié)。mex和mbuild編譯的C/C+文件的差別:使用mbuild命令編譯的C/C+源文件中,必須包含main()函數(shù),它能獨(dú)立于Matlab運(yùn)行。而mex命令編譯的C/C+源文件中不含main()函數(shù),它是以mexfunction()函數(shù)作為入口的,編譯后生成的是me
8、x文件,被Matlab調(diào)用。一、mcc命令配置MATLAB的C/C+語言編譯器后,可以使用如下命令將.m程序編譯成exe文件或C/C+語言源程序。mcc -m mfilename %編譯生成exe文件,允許彈出MS-DOS命令窗口mcc -e mfilename %編譯生成靜默運(yùn)行的exe文件,不顯示運(yùn)行結(jié)果mcc -l mfilename %使用 Microsoft Windows SDK 7.1 (C) 編譯。 mcc -W cpplib:component_name -T link:lib mfilename %使用 Microsoft Windows SDK 7.1 (C+) 編譯。這
9、里主要介紹如何在matlab環(huán)境下,通過mcc命令,把m文件轉(zhuǎn)換為exe文件。無論是程序文件還是函數(shù)文件,都可以通過mcc命令將其轉(zhuǎn)換為exe文件。程序文件轉(zhuǎn)換成的exe文件可以在直接運(yùn)行,函數(shù)文件轉(zhuǎn)換的exe文件則需要通過commandline輸入?yún)?shù),但輸入的參數(shù)為char型,因此在程序里必須予以考慮。舉例如下:1. 建立一個(gè)m文件建立的m文件可以是程序文件,也可以是函數(shù)文件。例如,在matlab中建立一個(gè)m文件,命名為testadd.m,內(nèi)容如下:function result = testadd(v1, v2)% 函數(shù)程序使用mcc生成獨(dú)立的可執(zhí)行程序舉例if (ischar(v1)
10、v1 = str2num(v1);endif (ischar(v2) v2 = str2num(v2);endresult = v1 + v2;disp(輸入的兩個(gè)參數(shù)之和為:);disp(result);reply = input(Press any key to leave., s);fprintf(Thanks for using!n);2. 生成exe文件在command window輸入“mcc -m testadd.m”,等待生成testadd.exe文件。3. 運(yùn)行exe文件對(duì)于程序文件生成的exe文件,雙擊運(yùn)行即可。對(duì)于函數(shù)文件生成的exe文件,通常需要在命令行對(duì)參數(shù)進(jìn)行賦值。
11、由于前面生成的testadd.exe程序是由Matlab的函數(shù)文件編譯而成,故需要在運(yùn)行時(shí)給輸入?yún)?shù)賦值,賦值方法是將參數(shù)列表附在程序名的后面用空格分開。1). 通過批處理文件運(yùn)行在該程序所在的文件夾中建立一個(gè)批處理文件testadd.cmd(用記事本或其他文本編輯器建立),例如輸入testadd.exe 10 15并保存,雙擊運(yùn)行testadd.cmd。2). 通過windows控制臺(tái)運(yùn)行打開開始運(yùn)行窗口,輸入cmd進(jìn)入dos窗口,然后進(jìn)入包含testadd.exe的文件夾,例如輸入“testadd.exe 16 29”運(yùn)行該程序。值得注意的是,testadd.m函數(shù)有兩個(gè)參數(shù),而testa
12、dd.exe的輸入?yún)?shù)只能通過commandline參數(shù)輸入,但輸入的參數(shù)為char型,所以程序里必須對(duì)此考慮。對(duì)于一個(gè)不需要運(yùn)行中輸入?yún)?shù)的Matlab程序,編譯后使用方便快捷,但要現(xiàn)實(shí)計(jì)算結(jié)果的話,會(huì)彈出黑色的MS-DOS命令窗口。請(qǐng)看如下程序:%請(qǐng)將如下程序存入testexe.mclear;t1=1 11 21 31 41 51 61 71;t2=1.3 4.4 8.3 19.6 28.6 30.7 32.9 33.4;disp(t1=)disp(t1)disp(t2=)disp(t2)plot(t1,t2,*r-)t3=factor(5)t4=magic(5)t5=謝謝同學(xué)們能夠認(rèn)真學(xué)
13、習(xí)數(shù)學(xué)軟件!pause(5)在Matlab的命令窗口輸入命令mcc -m testexe,得到可在windows下獨(dú)立運(yùn)行的程序testexe.exe,所繪圖形與在Matlab環(huán)境下的效果一樣。二、mex命令用戶可以在Matlab中按簡(jiǎn)單的M文件語法規(guī)則設(shè)計(jì)出來完成特定計(jì)算的算法。然后用Matlab編譯器調(diào)用mex命令創(chuàng)建C共享庫函數(shù)(DLL)或C+靜態(tài)函數(shù)庫,最后將它們整合到C/C+應(yīng)用程序中,編譯完這些C/C+應(yīng)用程序,就可以用這些算法來實(shí)現(xiàn)特定的計(jì)算功能。當(dāng)然這過程中也隱藏了算法和加快了代碼的執(zhí)行效率。由于mex文件執(zhí)行效率高,故如果有文件重名的話,Matlab將優(yōu)先調(diào)用mex文件。Ma
14、tlab的mex命令只能編譯不含main()的C/C+文件,生成的mex函數(shù)供Matlab調(diào)用。mex mfilename %編譯不含main()的C/C+文件生成mex函數(shù)mbuild mfilename %編譯含有main()的C/C+文件生成mex函數(shù)通過把耗時(shí)長的函數(shù)用c語言實(shí)現(xiàn),并編譯成mex函數(shù)可以加快執(zhí)行速度。Matlab本身是不帶c語言編譯器的,所以要求你的機(jī)器上安裝VC,Dev-C+或WatcomC等編譯器之一。如果你在安裝Matlab時(shí)已經(jīng)設(shè)置過編譯器,那么現(xiàn)在你應(yīng)該就可以使用mex命令來編譯c語言的程序了。如果當(dāng)時(shí)沒有設(shè)置,就在Matlab里鍵入mex-setup,并根據(jù)
15、提示一步步設(shè)置就可以了。需要注意的是,較低版本的Matlab在設(shè)置編譯器路徑時(shí),只能使用路徑名稱的8字符形式。比如我用的VC裝在路徑C:PROGRAMFILESDEVSTUDIO下,那在設(shè)置路徑時(shí)就要寫成:“C:PROGRA1”這樣設(shè)置完之后,mex就可以執(zhí)行了。為了測(cè)試你的路徑設(shè)置正確與否,把下面的程序存為hello.c。/*hello.c*/#include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) mexPrintf(hello,world!n); 假設(shè)你把hello.c放
16、在了C:test下,在Matlab里用CDC:test將當(dāng)前目錄改為C:test。(注意,僅將C:test加入搜索路徑是沒有用的)在命令窗口執(zhí)行:mexhello.c如果一切順利,編譯應(yīng)該在出現(xiàn)編譯器提示信息后正常退出。如果你已將C:test加入了搜索路徑,現(xiàn)在鍵入hello,程序會(huì)在屏幕上打出一行:hello,world!分析hello.c,可以看到程序的結(jié)構(gòu)是十分簡(jiǎn)單的,整個(gè)程序由一個(gè)接口子過程mexFunction構(gòu)成:voidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)Matlab的mex函數(shù)有一定的接口規(guī)范,期
17、中nlhs:輸出參數(shù)數(shù)目plhs:指向輸出參數(shù)的指針nrhs:輸入?yún)?shù)數(shù)目prhs:指向輸入?yún)?shù)的指針例如,使用 a,b=test(c,d,e) 調(diào)用mex函數(shù)test時(shí),傳給test的這5個(gè)參數(shù)分別是plhs2,prhs3,其中:prhs0=cprhs1=dprhs2=e當(dāng)函數(shù)返回時(shí),將會(huì)把你放在plhs0,plhs1里的地址賦給a和b,達(dá)到返回?cái)?shù)據(jù)的目的。也許你已經(jīng)注意到,prhsi和plhsi都是指向類型mxArray類型數(shù)據(jù)的指針。這個(gè)類型是在mex.h中定義的,事實(shí)上,在Matlab里大多數(shù)數(shù)據(jù)都是以這種類型存在。當(dāng)然還有其他的數(shù)據(jù)類型,可以參考Apiguide.pdf里的介紹。為了
18、讓大家能更直觀地了解參數(shù)傳遞的過程,我們把hello.c改寫一下,使它能根據(jù)輸入?yún)?shù)的變化給出不同的屏幕輸出:/hello1.c#includemex.hvoidmexFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)inti;i=mxGetScalar(prhs0);if(i=1)mexPrintf(hello,world!n);elsemexPrintf(大家好!n);將這個(gè)程序編譯通過后,執(zhí)行hello(1),屏幕上會(huì)打出:hello,world!而hello(0)將會(huì)得到:大家好!現(xiàn)在,程序hello已經(jīng)可以根據(jù)輸入?yún)?shù)來給
19、出相應(yīng)的屏幕輸出。在這個(gè)程序里,除了用到了屏幕輸出函數(shù)mexPrintf(用法跟c里的printf函數(shù)幾乎完全一樣)外,還用到了一個(gè)函數(shù):mxGetScalar,調(diào)用方式如下:i=mxGetScalar(prhs0);Scalar就是標(biāo)量的意思。在Matlab里數(shù)據(jù)都是以數(shù)組的形式存在的,mxGetScalar的作用就是把通過prhs0傳遞進(jìn)來的mxArray類型的指針指向的數(shù)據(jù)(標(biāo)量)賦給C程序里的變量。這個(gè)變量本來應(yīng)該是double類型的,通過強(qiáng)制類型轉(zhuǎn)換賦給了整形變量i。既然有標(biāo)量,顯然還應(yīng)該有矢量,否則矩陣就沒法傳了??聪旅娴某绦颍?hello2.c#includemex.hvoidm
20、exFunction(intnlhs,mxArray*plhs,intnrhs,constmxArray*prhs)int*i;i=mxGetPr(prhs0);if(i0=1)mexPrintf(hello,world!n);elsemexPrintf(大家好!n);這樣,就通過mxGetPr函數(shù)從指向mxArray類型數(shù)據(jù)的prhs0獲得了指向double類型的指針。但是,還有個(gè)問題,如果輸入的不是單個(gè)的數(shù)據(jù),而是向量或矩陣,那該怎么處理呢?通過mxGetPr只能得到指向這個(gè)矩陣的指針,如果我們不知道這個(gè)矩陣的確切大小,就沒法對(duì)它進(jìn)行計(jì)算。為了解決這個(gè)問題,Matlab提供了兩個(gè)函數(shù)mxG
21、etM和mxGetN來獲得傳進(jìn)來參數(shù)的行數(shù)和列數(shù)。下面例程的功能很簡(jiǎn)單,就是獲得輸入的矩陣,把它在屏幕上顯示出來:/show.c 1.0 #include mex.h void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs) double *data; int M,N; int i,j; data=mxGetPr(prhs0); /獲得指向矩陣的指針 M=mxGetM(prhs0); /獲得矩陣的行數(shù) N=mxGetN(prhs0); /獲得矩陣的列數(shù) for(i=0;iM;i+) for(j=0;jN;j
22、+) mexPrintf(%4.3f ,dataj*M+i); mexPrintf(n); 編譯完成后,用下面的命令測(cè)試一下:a=1:10;b=a;a+1;show(a)show(b)需要注意的是,在Matlab里,矩陣第一行是從1開始的,而在C語言中,第一行的序數(shù)為零,Matlab里的矩陣元素b(i,j)在傳遞到C中的一維數(shù)組data后對(duì)應(yīng)于dataj*M+i。輸入數(shù)據(jù)是在函數(shù)調(diào)用之前已經(jīng)在Matlab里申請(qǐng)了內(nèi)存的,由于mex函數(shù)與Matlab共用同一個(gè)地址空間,因而在prhs里傳遞指針就可以達(dá)到參數(shù)傳遞的目的。但是,輸出參數(shù)卻需要在mex函數(shù)內(nèi)申請(qǐng)到內(nèi)存空間,才能將指針放在plhs中傳遞
23、出去。由于返回指針類型必須是mxArray,所以Matlab專門提供了一個(gè)函數(shù):mxCreateDoubleMatrix來實(shí)現(xiàn)內(nèi)存的申請(qǐng),函數(shù)原型如下:mxArray*mxCreateDoubleMatrix(intm,intn,mxComplexityComplexFlag)m:待申請(qǐng)矩陣的行數(shù)n:待申請(qǐng)矩陣的列數(shù)為矩陣申請(qǐng)內(nèi)存后,得到的是mxArray類型的指針,就可以放在plhs里傳遞回去了。但是對(duì)這個(gè)新矩陣的處理,卻要在函數(shù)內(nèi)完成,這時(shí)就需要用到前面介紹的mxGetPr。使用mxGetPr獲得指向這個(gè)矩陣中數(shù)據(jù)區(qū)的指針(double類型)后,就可以對(duì)這個(gè)矩陣進(jìn)行各種操作和運(yùn)算了。下面的
24、程序是在上面的show.c的基礎(chǔ)上稍作改變得到的,功能是將輸入數(shù)據(jù)加10后輸出/reverse.c 1.0#include mex.hvoid mexFunction(int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; inData=mxGetPr(prhs0); M=mxGetM(prhs0); N=mxGetN(prhs0); plhs0=mxCreateDoubleMatrix(M,N,mxREAL); outData=mxGetPr
25、(plhs0); for(i=0;iM;i+) for(j=0;jN;j+) outDataj*M+i=inDataj*M+i+10;當(dāng)然,Matlab里使用到的并不是只有double類型這一種矩陣,還有字符串類型、稀疏矩陣、結(jié)構(gòu)類型矩陣等等,并提供了相應(yīng)的處理函數(shù)。本文用到編制mex程序中最經(jīng)常遇到的一些函數(shù),其余的詳細(xì)情況清參考Apiref.pdf。通過前面兩部分的介紹,大家對(duì)參數(shù)的輸入和輸出方法應(yīng)該有了基本的了解。具備了這些知識(shí),就能夠滿足一般的編程需要了。但這些程序還有些小的缺陷,以前面介紹的reverse.c由于前面的例程中沒有對(duì)輸入、輸出參數(shù)的數(shù)目及類型進(jìn)行檢查,導(dǎo)致程序的容錯(cuò)性很差,以下程序則容錯(cuò)性較好/reverse1.c 1.0#include mex.hvoid mexFunction(int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs) double *inData; double *outData; int M,N; int i,j; /異常處理 /異常處理 if(nrhs!=1) mexErrMsgTxt(USAGE: b=reverse(a)/n); if(!mxIsDouble(prhs0) mexEr
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度國家級(jí)林木種植與銷售合作協(xié)議4篇
- 2024項(xiàng)目管理:招投標(biāo)策略與協(xié)議執(zhí)行要點(diǎn)版
- 二零二五年度旅行社與茶館餐飲服務(wù)合作協(xié)議4篇
- 二零二五年度水文地質(zhì)勘探打井施工合作協(xié)議3篇
- 二零二五年度可再生能源項(xiàng)目投資合作協(xié)議4篇
- 2024音樂素材及視頻素材一次性購買使用合同
- 二零二五年度綠色建筑認(rèn)證施工承包合同2篇
- 二零二五年度融資租賃抵押借款合同范本3篇
- 2025年星級(jí)酒店客房清潔與消毒服務(wù)合同3篇
- 二零二五年度新型環(huán)保煤炭開采居間代理合同范本4篇
- 第二章 運(yùn)營管理戰(zhàn)略
- 《三本白皮書》全文內(nèi)容及應(yīng)知應(yīng)會(huì)知識(shí)點(diǎn)
- 專題14 思想方法專題:線段與角計(jì)算中的思想方法壓軸題四種模型全攻略(解析版)
- 醫(yī)院外來器械及植入物管理制度(4篇)
- 圖像識(shí)別領(lǐng)域自適應(yīng)技術(shù)-洞察分析
- 港口與港口工程概論
- 《念珠菌感染的治療》課件
- 新概念英語第二冊(cè)考評(píng)試卷含答案(第49-56課)
- 商業(yè)倫理與企業(yè)社會(huì)責(zé)任(山東財(cái)經(jīng)大學(xué))智慧樹知到期末考試答案章節(jié)答案2024年山東財(cái)經(jīng)大學(xué)
- 【奧運(yùn)會(huì)獎(jiǎng)牌榜預(yù)測(cè)建模實(shí)證探析12000字(論文)】
- (完整版)譯林版英語詞匯表(四年級(jí)下)
評(píng)論
0/150
提交評(píng)論