學習與示例:
附博文:
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...