MATLAB中MEX文件的编写与调试
***************************************************
更多精彩,歡迎進(jìn)入:http://shop115376623.taobao.com
http://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-9510581626.24.ZO6sko&id=43401674106
精通MATLAB混合編程視頻講解
MATLAB各類函數(shù)視頻講解
基于MATLAB的高等數(shù)學(xué)問題求解?
MATLAB函數(shù)速查視頻講解
面向?qū)ο驝++視頻教程
精通MATLAB混編編程demo及PDF?
QQ:2911984429
http://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-9510581626.24.ZO6sko&id=43401674106
***************************************************
1. MEX的編寫格式
寫MEX程序其實(shí)就是寫一個(gè)DLL程序,所以你可以使用C,C++,Fortran等多種編程語言來寫。
編寫MEX程序的編輯器可以使用MATLAB的代碼編輯器,也可使用自己的C++編輯器,如VS2008等。
用MATLAB的編輯器的好處是,MEX函數(shù)會(huì)加粗高亮顯示,這給程序編寫帶來便利,可惜無法動(dòng)態(tài)調(diào)試。如用VC即可編譯也可調(diào)試,比較方便。mex的編譯結(jié)果實(shí)際上就是一個(gè)帶輸出函數(shù)mexFunction 的dll文件,所以會(huì)用VC編寫和調(diào)試dll,就會(huì)用VC編寫和調(diào)試MEX程序。
a. MEX文件格式
#include "mex.h"
void mexFunction( int nlhs, mxArray *plhs[],
????????????????? int nrhs, const mxArray *prhs[] )
{
}
四個(gè)參數(shù)分別用來輸出和輸入數(shù)據(jù):?nlhs 輸出參數(shù)個(gè)數(shù),plhs 輸出參數(shù)指針?(nrhs和prhs是輸入?yún)?shù)相關(guān)的)。
1、nlhs:一個(gè)int型變量,他與M文件中的nargout變量的作用一樣,用于記錄輸出參數(shù)的個(gè)數(shù),即matlab函數(shù)調(diào)用的左端變量個(gè)數(shù)
2、plhs:一個(gè)mxArray型指針數(shù)組,數(shù)組中的每個(gè)元素分別指向每個(gè)輸出參數(shù)的起始地址。
3、nrhs:一個(gè)int型變量,與M文件中的nargin變量的作用一樣,用于記錄輸入?yún)?shù)的個(gè)數(shù),即matlab函數(shù)調(diào)用的右端變量的個(gè)數(shù)
4、prhs:一個(gè)mxArray型的指針數(shù)組,數(shù)組中的每個(gè)元素分別指向每個(gè)輸入?yún)?shù)的起始地址。
在matlab啟動(dòng)MEX文件時(shí),傳遞的參數(shù)就是mexFunction函數(shù)中的參數(shù)。例如;matlab調(diào)用一個(gè)名為fun的MEX函數(shù),其格式為:[x,y]=fun[a,b,c]。此時(shí),首先將函數(shù)的輸入變量的個(gè)數(shù)賦給nrhs,此處是3;然后生成一個(gè)prhs矩陣,用來存放輸入?yún)?shù)的起司地址,此處prhs(1)、prhs(2)、prhs(3),分別指向輸入變量a、b、c的起始地址;再將函數(shù)的輸出變量的個(gè)數(shù)賦給變量nlhs,此處是2;最后生成一個(gè)plhs矩陣,用來存放輸出參數(shù)的起始地址,此處plhs(1)、plhs(2)分別指向輸出變量x、y的起始地址。
注意: 我們對(duì)輸出和輸入?yún)?shù)的操作都是通過指針的方式進(jìn)行的。(這點(diǎn)很容易理解,因?yàn)槲覀兊挠?jì)算結(jié)果是需要傳遞給MATLAB的,實(shí)際上我們傳遞的不是數(shù)據(jù),而是指針。MATLAB可以通過這些指針,訪問內(nèi)存中的數(shù)據(jù)。)
b. 操作輸入數(shù)據(jù)
對(duì)輸入數(shù)據(jù)進(jìn)行操作,需要通過MEX函數(shù)mxGetPr 得到數(shù)據(jù)的指針地址。 mxGetM 和 mxGetN 得到矩陣數(shù)據(jù)的行和列 (返回整數(shù))。對(duì)于實(shí)矩陣,我們可以定義 double *M; 來對(duì)實(shí)矩陣數(shù)據(jù)操作。如:
double *M;
int m,n;
// 指針指向第一個(gè)參數(shù)的數(shù)據(jù)地址
M = mxGetPr(prhs[0]);
m = mxGetM(prhs[0]);
n = mxGetN(prhs[0]);
需要注意的是,MATLAB矩陣數(shù)據(jù)的存儲(chǔ)順序是"從上到下,從左到右"的,這點(diǎn)和Fortran是一樣的。也就是說對(duì)于MATLAB的m x n的矩陣A。 A(1,1) 就是 *M,A(2,1) 就是 *(M+1) ,以此類推,A(i,j) 就是 *(M + m*(j-1) + (i-1)).
注意: MATLAB的指標(biāo)從1開始,C的指標(biāo)從0開始。
c. 操作輸出數(shù)據(jù)
對(duì)于輸出數(shù)據(jù),我們需要首先分配內(nèi)存空間,有專門的mex函數(shù)可以使用,如:
plhs[0] = mxCreateDoubleMatrix(m,n, mxREAL); //生成m x n 的實(shí)矩陣。
同輸入數(shù)據(jù)一樣,要對(duì)輸出數(shù)據(jù)操作,我們也需要一個(gè)指向數(shù)據(jù)的指針變量,如
double *A;
A = mxGetPr(plhs[0]);
下面介紹一下如何使用VS2008編寫MEX并編譯調(diào)試。
2. VC中編寫MEX
打開VS2008, 新建項(xiàng)目, 選擇MFC DLL.
a. 配置項(xiàng)目屬性
打開項(xiàng)目屬性配置頁,C++ -> 附加包含目錄 加入MATLAB安裝目錄下的 \extern\include 路徑。
連接器 -> 附加庫目錄 加入MATLAB的 \extern\lib\win32\microsoft 路徑。
連接器 -> 輸入 -> 附加依賴項(xiàng) 輸入libmx.lib libeng.lib libmat.lib libmex.lib 這四個(gè)lib文件。
b. 編輯輸出函數(shù)
在項(xiàng)目源文件的. def 中EXPORTS段加入 mexFunction, 如:
EXPORTS
??? ; 此處可以是顯式導(dǎo)出
??? mexFunction
c. 編寫MEX文件
項(xiàng)目文件中新建一個(gè)C++文件 如 mexproc.cpp,里面按前面介紹的格式編寫代碼即可。
d. VC編譯MEX
像編譯其他程序那樣直接編譯即可,成功會(huì)生成dll文件。如果編譯鏈接時(shí)出錯(cuò),根據(jù)錯(cuò)誤提示,檢查一下lib和h的路徑是否正確,有無缺少lib文件,代碼是否有語法錯(cuò)誤等。
3. VC中調(diào)試MEX
要調(diào)試MEX程序就要先編譯,再調(diào)用她。所以我們需要在MATLAB中調(diào)用這個(gè)函數(shù),并在VC的MEX程序相應(yīng)位置處下斷點(diǎn)即可。調(diào)用的函數(shù)名就是dll的主文件名,你可以根據(jù)自己的需要改名。我們用mymexfun.dll為例,先在VC的 mexFunction 函數(shù)代碼段開始處F9下斷。然后Ctrl+Alt+P附加MATLAB.exe進(jìn)程。這樣就可以運(yùn)行命令調(diào)試程序了。我們可以在MATLAB的命令行里輸入命令:
????????? [輸出變量] = mymexfun(輸入變量)
(如果命令找不到,檢查一下matlab當(dāng)前路徑,和path路徑。)
程序一旦被調(diào)用,就會(huì)被斷在我們的斷點(diǎn)處。接著你就可以像調(diào)試C++程序那樣調(diào)試MEX程序了。
在MATLAB中編譯MEX可以輸入:?mex 文件名.cpp
MATLAB上編譯MEX時(shí),你可以選擇不同的編譯器如lc, gcc等。也可以在編譯時(shí)附加lib和h文件。關(guān)于mex的命令詳解請(qǐng)參考MATLAB幫助文檔。
總結(jié)
以上是生活随笔為你收集整理的MATLAB中MEX文件的编写与调试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Implicit declaration
- 下一篇: Kaggle Tabular Playg