寫在前面
-
關於mex, mex類似於DLL,所以可以用C, C++等語言編寫,同樣的在MATLAB上也可以生成。
-
在MATLAB上編寫MEX適用於那些已經完成了單步調試后的C函數模塊,因為MATLAB無法對MEX的源文件也就是C函數進行調試,只會在編譯的時候對一些語法錯誤進行檢查,但是對於諸如數組越界之類的內存泄漏問題,MATLAB則無法進行檢查。出現這類問題基本就是強退。因此,最好將C函數模塊在VS下調試完成后再利用MATLAB進行后續結果分析,特別是涉及到一些數據處理,比如作圖,擬合之類。
-
利用VS完成MEX的編寫,需要進行一些配置,比如添加頭文件,相關的依賴項等。
利用MATLAB編寫MEX
1.編譯環境設置,選擇需要的C/C++編譯器
mex -setup
2.編寫MEX
#include "mex.h"
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]){
}
在mexFunction函數中,會涉及到輸入數據的操作,利用mxGetPr得到數據的指針地址。mxGetM和mxGetN會返回矩陣的行和列(整數)。另外MATLAB的矩陣存儲順序是“從上到下,從左到右”。即A(i,j) = (M + m(j-1) +(i-1))
關於輸出數據的操作,主要包括對輸出數據分配內存空間,即
plhs[0]=mxCreateDoubleMatrix(m, n, mxREAL); //生成一個mxn的實矩陣
和輸入數據一樣,同樣需要一個指向數據的指針變量
double *a;
A = mxGetPr(plhs[0];
下面給出了一個簡單的例子,函數返回兩個數的和。
#include "mex.h"
double testAdd(double x, double y){
return x + y;
}
void mexFunction(
int nlhs,
mxArray *plhs[],
int nrhs,
const mxArray *prhs[]){
double *a;
double b,c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = testAdd(b,c);
}
利用VS編寫MEX
1.打開VS,新建項目,選擇MFC DLL
2.配置項目屬性
- C/C++ -> Additional Include Dirrctories 包含目錄, 添加MATLAB安裝目錄下的\extern\include路徑
- Linker -> General -> Additional Library Directories 庫目錄, 添加MATLAB安裝路徑下的\extern\lib\win64\microsoft
- Linker -> Input -> Additional Dependencies 附加依賴項,添加libmx.lib;libmex.lib;libmat.lib;
3.創建編輯輸出函數
在源文件的路徑下新建.def的文件,在文件內寫入
EXPORTS mexFunction
在項目屬性頁的Linker->Input->Module Definition File內加入創建的***.def文件。
另外,更改Configuration Properties->General->Target Extension內容.mexw64
4.編寫MEX文件
MEX文件編寫要求與MATLAB內的一致。
5.VS編譯MEX
編寫完成后進行BUILD,沒有錯誤在源碼上一級的x64文件夾中的Debugw中會生成MATALB MEX類型的輸出文件,可以在MATLAB環境下進行驗證。
reference:
https://www.cnblogs.com/arxive/p/4687766.html
https://blog.csdn.net/bensnake/article/details/78832169