標籤:
csunking貢獻,2015-9-22 1712
1、 概述
通過使用C/C++與Matlab混合編程,既可以享受到C代碼快速執行的速度,又可以方便的使用Matlab眾多的庫函數和強大的繪圖功能。讓Matlab調用C函數是通過DLL檔案實現的,而這個DLL的開發過程不僅僅可以使用Matlab內建的mex命令,還可以使用VC++開發環境,使用VC有很多好處,一是讓我回到了原來熟悉的開發環境中,二能夠使用更加標準的C++編譯器,第三點也是最爽的,可以使用VC強大的調試功能。
此次文檔更新時使用的開發環境為:Visual Studio 2012, Matlab R2015a
2、 步驟
1.啟動VS,建立一個空的項目ATSRID。然後設定項目屬性資訊。然後,建立一個.cpp檔案atsrid.cpp。並在添加Preprocessor Definitions中添加MATLAB_MEX_FILE的宏定義。
將輸出檔案的尾碼名改為mexw64/mexw32
$(OutDir)$(TargetName).mexw64
設定項目產生程式的平台位元屬性
2. 為matlab函數提供標頭檔和靜態庫的支援
包含目錄:
E:\Program Files\MATLAB\R2015a\extern\include
E:\Program Files\MATLAB\R2015a\extern\include\win64
庫目錄
E:\Program Files\MATLAB\R2015a\extern\lib\win64\microsoft
連接器中添加靜態連結庫檔案
libmx.lib;libmat.lib;libmex.lib;
3. 在atsrid.cpp中編寫mex檔案中的內容。然後用利用.def檔案匯出mexFunction函數。
#include "mex.h"void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){ int nlhs1,nrhs1; mxArray *plhs1[1],*prhs1[1]; mxArray *array_ptr; nlhs1=1; nrhs1=1; if((array_ptr=mexGetVariable("base","x"))==NULL) //"base" means the command window where { //we get the matrix "x". mexErrMsgTxt("Variable ‘x‘ not in the workspace."); } else { prhs1[0]=array_ptr; mexCallMATLAB(nlhs1,plhs1,nrhs1,prhs1,"det"); mexPrintf("Det(array_ptr) == %g\n",mxGetScalar(plhs1[0])); }}
讓函數從DLL中的匯出有兩種方法,__declspec(dllexport)命令匯出和def檔案匯出,但由於需要匯出mexFunction在”mex.h”中已經定義,所以前一種匯出方法行不通,這裡採用def檔案匯出。
首先告訴編譯器我使用了xx.def檔案,然後再在檔案中加入內容。通過上述方式定義的def檔案會自動添加入下面的屬性中。
檔案中的內容如下
LIBRARY ATSRID; 指的是模組名稱(可以用建立的項目名稱)
EXPORTS mexFunction
4. 編譯運行,產生ATSRID.mexw64檔案。然後將該檔案拷貝到Matlab的目前的目錄下,然後進行該模組的測試
x=magic(100);
ATSRID();
可以將結果與det(x)得到的相比較,查看是否正確。
備忘:在VS項目中的atsrid.cpp可以直接放在matlab的目前的目錄下進行mex atsrid.cpp編譯,也同樣可以產生atsrid.mexw64。之所以在Visual C++中進行編譯,是因為方便調試該程式。下面也將介紹另外一種調試方法。
3、 採用VS Debug mex檔案
方便對各位在matlab上的researcher or developer。
1、初次使用mex時需要配置配置matlabmex編譯器
mex -setup
2、接下來,用-g選項編譯mex源檔案,-g表示編譯結果中包含調試資訊。
mex -g atsrid.cpp
3、開啟Visual Studio,不要關閉你的matlab。在Visual Studio的工具菜單中,選擇關聯到一個進程。
Visual Studio會載入資料,在彈出的對話方塊中選擇,選擇matlab進程,點擊“關聯”。
4、首先在Visual Studio的ATSRID項目中的atsrid.cpp檔案代碼處添加斷點。然後,開啟matlab 放置atsrid.mexw64的目前的目錄,在程式碼中輸入下面的代碼
x=magic(10);
atsrid();
之後,會發現Visual Studio會自動將程式運行到斷點出,等待下一步的操作。
當斷點被觸發了,你就可以利用Visual Studio來查看你的變數,記憶體,調試你的程式了。
引用
似水流年,2009,http://knhunter.blogbus.com/.
在Visual Studio中開發Matlab mex檔案,產生mexw64/mexw32