Matlab 矩陣運算極快,但大量 for 循環極慢。將熱點循環移植為 C 語言編譯成 .mexw64(Windows 64位)動態庫,Matlab 可像內建函數一樣調用,顯著提速。
Matlab 命令窗執行 mex -setup 選擇 C 編譯器(Visual Studio / MinGW / GCC)。
mexFunction:固定簽名
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]);
nrhs/prhs:輸入參數個數與指針數組(prhs[i] 指向第 i 個輸入 mxArray)。nlhs/plhs:輸出參數個數與指針數組,函數需分配 mxArray 並掛入 plhs。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 *out = mxGetPr(plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL));
double a = *mxGetPr(prhs[0]);
double b = *mxGetPr(prhs[1]);
*out = add(a, b);
}
編譯:mex add.c 生成 add.mexw64。Matlab 中直接 c = add(1.2, 3.4)。