MATLAB中MEX檔案的編寫與除錯

2022-01-24 14:46:49 字數 2576 閱讀 6943

學習與示例:

附博文:

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

MEX檔案編寫和除錯

作者kaien,2010 02 16 以前我寫過一篇文章,詳細的介紹過mex的格式,語法,編譯,除錯等。可惜記不清放在 了。而最近又用到mex程式設計,所以只能重新溫習一番。時間有限,只記下簡要流程和注意事項,以便往後查詢之需。1.mex的編寫格式 寫mex程式其實就是寫乙個dll程式,所以你可以使...

VC 編譯 MATLAB 的 mex 檔案

vc 編譯 matlab 的 mex 檔案 mex 檔案是 matlab 呼叫其他程式語言程式或演算法的介面。在 windows 環境中,mex 檔案是擴充套件檔名為 dll 的動態鏈結庫,可以在 m 程式中直接呼叫,使用者可以通過 234 matlab 實用教程 matlab 提供的命令 mex ...

MATLAB編譯C 問題(MEX檔案)

由於作業原因,需要matlab和c 聯合程式設計,matlab編譯c 檔案遇到一系列問題,現在彙總如下 首先關於大部分基礎知識,參閱這篇文章 matlab與c c 聯合程式設計之從matlab呼叫c c 執行mex setup後,matlab顯示如下 由於我使用的是matlab 2013a vs20...