Matlab是矩陣語言,如果運算可以用矩陣實現,其運算速度非常快。但若運算中涉及到大量循環,Matlab的速度令人難以忍受的。當必須使用for循環且找不到對應的矩陣運算來等效時,可以將耗時長的函數用C語言實現,並編譯成Mex文件,Matlab便可以像調用內建函數一樣調用C編寫的函數。Mex文件其實是一種動態鏈接庫,舊版本Matlab可以直接調用.dll,新版本要調用.mexw32或.mexw64文件。
編譯過程需要C語言編譯器,在Matlab中鍵入mex –setup進行安裝與配置。
MEX文件的源代碼組成:
(1)功能子程序。該過程包含了Mex文件實現計算功能的代碼,是標准的C語言子程序。
(2)入口子程序。該過程提供功能子程序與Matlab之間的接口,以mexFunction函數實現。注意,入口過程的名稱必須是mexFunction,並且包含四個參數,即
void mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);
nrhs(left hand side): 輸入參數的個數;
prhs是一個輸入數組,其內容為指針,指向mxArray類型的數據(MATLAB中所有數據都是以矩陣的形式mxArray保存的)。
nlhs, plhs含義類似。
具體地,若在Matlab中執行[a,b]=test(c,d,e) ,則nlhs=2, nrhs=3,prhs[0]指向c,prhs[1]指向d,prhs[2]指向e(可以理解為:prhs[0]=&c, prhs[1]=&d, prhs[2]=&e),注意prhs是const指針數組,故不能改變其指向內容;函數返回時將plhs[0],plhs[1]指向的內容賦給a,b(可以理解為a=*plhs[0], b=*plhs[1])。
例:新建add.c,源碼如下:
#include mex.h double add(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 = add(b, c); }