MEX檔案編寫和除錯

2022-03-23 23:23:25 字數 2685 閱讀 9627

作者kaien,2010/02/16

以前我寫過一篇文章,詳細的介紹過mex的格式,語法,編譯,除錯等。可惜記不清放在**了。而最近又用到mex程式設計,所以只能重新溫習一番。時間有限,只記下簡要流程和注意事項,以便往後查詢之需。

1. mex的編寫格式

寫mex程式其實就是寫乙個dll程式,所以你可以使用c,c++,fortran等多種程式語言來寫。

編寫mex程式的編輯器可以使用matlab的**編輯器,也可使用自己的c++編輯器,如vs2008等。

用 matlab的編輯器的好處是,mex函式會加粗高亮顯示,這給程式編寫帶來便利,可惜無法動態除錯。如用vc即可編譯也可除錯,比較方便。mex的編譯 結果實際上就是乙個帶輸出函式mexfunction 的dll檔案,所以會用vc編寫和除錯dll,就會用vc編寫和除錯mex程式。

a. mex檔案格式

#include "mex.h"

void mexfunction( int nlhs, mxarray *plhs,                  int nrhs, const mxarray *prhs ){

四個引數分別用來輸出和輸入資料:nlhs 輸出引數個數,plhs 輸出引數指標(nrhs和prhs是輸入引數相關的)。

注意: 我們對輸出和輸入引數的操作都是通過指標的方式進行的。(這點很容易理解,因為我們的計算結果是需要傳遞給matlab的,實際上我們傳遞的不是資料,而是指標。matlab可以通過這些指標,訪問記憶體中的資料。)

b. 操作輸入資料

對輸入資料進行操作,需要通過mex函式mxgetpr 得到資料的指標位址。 mxgetm 和 mxgetn 得到矩陣資料的行和列 (返回整數)。對於實矩陣,我們可以定義 double *m; 來對實矩陣資料操作。如:

double *m;

int m,n;

// 指標指向第乙個引數的資料位址

m = mxgetpr(prhs[0]);

m = mxgetm(prhs[0]);

n = mxgetn(prhs[0]);

需要注意的是,matlab矩陣資料的儲存順序是"從上到下,從左到右"的,這點和fortran是一樣的。也就是說對於matlab的m x n的矩陣a。 a(1,1) 就是 *m,a(2,1) 就是 *(m+1) ,以此類推,a(i,j) 就是 *(m + m*(j-1) + (i-1)).

注意: matlab的指標從1開始,c的指標從0開始。

c. 操作輸出資料

對於輸出資料,我們需要首先分配記憶體空間,有專門的mex函式可以使用,如:

plhs[0] = mxcreatedoublematrix(m,n, mxreal); //生成m x n 的實矩陣。

同輸入資料一樣,要對輸出資料操作,我們也需要乙個指向資料的指標變數,如

double *a;

a = mxgetpr(plhs[0]);

下面介紹一下如何使用vs2008編寫mex並編譯除錯。

2. vc中編寫mex

開啟vs2008, 新建專案, 選擇mfc dll.

a. 配置專案屬性

開啟專案屬性配置頁,c++ -> 附加包含目錄 加入matlab安裝目錄下的 \extern\include 路徑。

聯結器 -> 附加庫目錄 加入matlab的 \extern\lib\win32\microsoft 路徑。

聯結器 -> 輸入 -> 附加依賴項 輸入libmx.lib libeng.lib libmat.lib libmex.lib 這四個lib檔案。

b. 編輯輸出函式

在專案原始檔的. def 中exports段加入 mexfunction, 如:

exports    ; 此處可以是顯式匯出    mexfunction

c. 編寫mex檔案

專案檔案中新建乙個c++檔案 如 mexproc.cpp,裡面按前面介紹的格式編寫**即可。

d. vc編譯mex

像編譯其他程式那樣直接編譯即可,成功會生成dll檔案。如果編譯鏈結時出錯,根據錯誤提示,檢查一下lib和h的路徑是否正確,有無缺少lib檔案,**是否有語法錯誤等。

3. vc中除錯mex

要 除錯mex程式就要先編譯,再呼叫她。所以我們需要在matlab中呼叫這個函式,並在vc的mex程式相應位置處下斷點即可。呼叫的函式名就是dll的 主檔名,你可以根據自己的需要改名。我們用mymexfun.dll為例,先在vc的 mexfunction 函式**段開始處f9下斷。然後 ctrl+alt+p附加matlab.exe程序。這樣就可以執行命令除錯程式了。我們可以在matlab的命令列裡輸入命令:

[輸出變數] = mymexfun(輸入變數)

(如果命令找不到,檢查一下matlab當前路徑,和path路徑。)

程式一旦被呼叫,就會被斷在我們的斷點處。接著你就可以像除錯c++程式那樣除錯mex程式了。

在matlab中編譯mex可以輸入:mex 檔名.cpp

MATLAB中MEX檔案的編寫與除錯

學習與示例 附博文 1.mex的編寫格式 寫mex程式其實就是寫乙個dll程式,所以你可以使用c,c fortran等多種程式語言來寫。編寫mex程式的編輯器可以使用matlab的 編輯器,也可使用自己的c 編輯器,如vs2008等。用matlab的編輯器的好處是,mex函式會加粗高亮顯示,這給程式...

vs除錯MEX檔案

matlab裡面無法單步除錯mex函式,故需轉到vs上面除錯,這裡採用vs2010。參考網上很多人寫的方法但都很亂,雜,試了多次都沒有成功。今天終於解決了,現把方法記錄下來。1 vc中編寫mex函式 新建乙個win32 dll 空專案。2 新增原始檔test.cpp,編寫mex函式,mex函式編寫方...

VC 中建立MEX檔案及除錯

在 matlab 環境中可以方便的編輯 mex 檔案,而編譯 mex 檔案只要一句 mex 命令,所以一般不需要 vc 環境來建立 mex 檔案。但對於大型的 mex 程式,可能會比較複雜,容易出錯,這時可以利用 visual c 強大的除錯功能。下面通過乙個簡單的例子說明如何在 visual c ...