MATLAB 矩陣運算極快,但雙重/多重循環極慢。將熱點循環用 C 實現、編譯為 MEX(動態鏈接庫),可獲數十倍加速,且調用方式與內建函數無異。
double add(double,double)void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])// 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[]) {
/* 參數檢查 */
if (nrhs != 2) mexErrMsgTxt("Two inputs required.");
if (nlhs > 1) mexErrMsgTxt("Too many outputs.");
/* 獲取輸入標量 */
double a = mxGetScalar(prhs[0]);
double b = mxGetScalar(prhs[1]);
/* 創建輸出矩陣 (1x1 double) */
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
double *out = mxGetPr(plhs[0]);
/* 計算並賦值 */
*out = add(a, b);
}
# MATLAB 中 mex add.c # 生成 add.mexw64 (Windows) / add.mexa64 (Linux) result = add(1.1, 2.2) % 直接調用
// myhilb.c
#include "mex.h"
void myhilb(double *y, int n) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
y[i + j*n] = 1.0 / (i + j + 1); // 列主序
}
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[]) {
if (nrhs != 1 || !mxIsDouble(prhs[0]) || mxGetNumberOfElements(prhs[0]) != 1)
mexErrMsgTxt("Input must be a scalar double.");
int n = (int)mxGetScalar(prhs[0]);
plhs[0] = mxCreateDoubleMatrix(n, n, mxREAL);
myhilb(mxGetPr(plhs[0]), n);
}
| API | 用途 |
|---|---|
| mxCreateDoubleMatrix(m,n,mxREAL) | 創建 m×n 雙精度矩陣 |
| mxGetPr(pa) | 獲取實數數據指針 (double*) |
| mxGetScalar(pa) | 獲取 1×1 矩陣的標量值 |
| mxGetM/N(pa) | 獲取行數/列數 |
| mxIsDouble/IsNumeric/IsComplex | 類型檢查 |
| mexErrMsgTxt(msg) | 報錯並返回 MATLAB |
| mexPrintf(fmt,...) | 輸出到 MATLAB 命令窗口 |