MATLAB 強大的數學函數庫若能在 C/C++ 中直接調用,將極大拓展工程應用邊界。MATLAB 5.0+ 提供 C/C++ API,通過 mcc (MATLAB Compiler) 將 M 文件編譯為 C 代碼,再鏈接 MATLAB 數學庫 (libmatlb 等) 實現獨立運行。本文基於 MATLAB 6.5 (R13) 完整演示從 M 文件到可調用 C 函數的全流程。
mcc -m 生成 .c/.h 文件mlf* 數學函數調用mxArray 結構體sqrt(a)+sqrt(b) 計算messay.m
function c = messay()
a = 3.4;
b = 5.6;
c = sqrt(a) + sqrt(b);
# MATLAB 命令窗口
mex -setup # 選擇 Microsoft Visual C++
mbuild -setup # 同上
mcc -m messay.m
生成三文件:messay.h (聲明)、messay.c (核心邏輯)、messay_main.c (含 main 入口)。
Mmessay生成的 messay.c 中,真正執行計算的是內部函數 static mxArray *Mmessay(int nargout_)。關鍵計算行:
mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));
其中 mlf* 為 MATLAB C 數學庫函數,mclVv 為變量訪問輔助。
#include "libmatlb.h" // MATLAB C 數學庫頭文件
double Mmessay(double ina, double inb) {
mxArray *a = NULL, *b = NULL, *c = NULL;
double *outc = NULL;
// C double -> mxArray
a = mlfScalar(ina);
b = mlfScalar(inb);
// 核心計算 (直接復用生成的 mlf 調用序列)
mlfAssign(&c, mclPlus(mlfSqrt(mclVv(a, "a")), mlfSqrt(mclVv(b, "b"))));
// mxArray -> C double
outc = mxGetPr(c); // 獲取實部數據指針
double result = *outc;
// 釋放 mxArray 內存
mxDestroyArray(a);
mxDestroyArray(b);
mxDestroyArray(c);
return result;
}
libmat.liblibmatlb.liblibmex.liblibmx.lib若無 .lib,可用 VC lib.exe 從對應 .def 生成:
lib /def:libmat.def /machine:x86 /out:libmat.lib
| MATLAB 5.x | MATLAB 6.5 |
|---|---|
matrix.h, mcc.h, matlab.h | mex.h, libmatlb.h, libmatlbm.h |
libmmfile.lib, libmatlb.lib, libmcc.lib, libmx.lib | libmat.lib, libmatlb.lib, libmex.lib, libmx.lib |
大量 mcc* API | 改為 mx* API (內存/類型轉換) |
mlf* 庫函數)。工具箱函數、用戶自定義嵌套函數若無預編譯庫支持,會產生未定義符號錯誤。手動調整參數傳遞極其繁瑣。mxArray 動態內存管理,C 靜態內存模型難以映射。GUI、圖形顯示類函數 (plot, figure 等) 無法直接轉換。engOpen/engEvalString/engGetVariable 動態調用。MATLAB 6.5 提供 MATLAB Project Wizard (執行 mbuild -setup 後在 VC 中可用),可直接創建 MATLAB 項目,但遇到未定義嵌套函數時會誤將函數名識別為變量名,mcc 命令行方式更可靠。
現代替代建議 (2024+):