C++Builder 擅長 GUI、硬體介面、即時控制;MATLAB 擅長矩陣運算、數值分析、科學繪圖、工具箱生態。兩者結合可實現 **「C++Builder 做架構與介面,MATLAB 做核心演算」** 的高效分工。本文介紹基於 **MATLAB Engine API (DLL)** 的呼叫方法,適用 MATLAB 4.2+ / C++Builder 3.0+ 環境。
libeng.dll (Engine), libmat.dll (MAT 檔), libmx.dll (矩陣存取)implib 產生對應 .lib 靜態連結庫.lib,引入 engine.h,即可直接呼叫 MATLAB 函數implib libeng.lib libeng.def (同理 libmat.lib, libmx.lib),.def 檔位於 `libeng.lib, libmat.lib, libmx.lib| 函數 | 用途 |
|---|---|
engOpen(NULL) | 啟動 MATLAB Engine 進程,回傳 Engine* 控制代碼 |
engClose(ep) | 關閉 Engine |
engEvalString(ep, "cmd") | 在 MATLAB 執行指令字串 |
engGetVariable(ep, "var") | 從 MATLAB 工作區取得變數 (mxArray*) |
engPutVariable(ep, "var", arr) | 將 mxArray* 送入 MATLAB 工作區 |
mxCreateDoubleMatrix(m,n,mxREAL) | 建立雙精度實數矩陣 |
mxGetPr(arr) | 取得矩陣資料指標 (double*) |
mxDestroyArray(arr) | 釋放 mxArray 記憶體 |
engOutputBuffer(ep, buf, size) | 擷取 MATLAB 指令視窗輸出文字 |
#include
#include
void DemoMatlab() {
Engine *ep = engOpen(NULL); // 1. 啟動 Engine
if (!ep) return;
char buffer[200];
engOutputBuffer(ep, buffer, 200); // 捕獲輸出
int data[6] = {1,2,3,4,5,6};
mxArray *S = mxCreateDoubleMatrix(1, 6, mxREAL);
mxArray *T = NULL;
mxSetName(S, "S");
memcpy(mxGetPr(S), data, 6*sizeof(int)); // 填入資料
engPutVariable(ep, "S", S); // 2. 送入工作區
engEvalString(ep, "T = S ./ (S.^2);"); // 3. 執行運算 (元素除法)
engEvalString(ep, "plot(S, T);"); // 4. 繪圖 (彈出 MATLAB 圖形視窗)
T = engGetVariable(ep, "T"); // 5. 取回結果
// 處理 T 資料...
mxDestroyArray(S);
mxDestroyArray(T);
engClose(ep); // 6. 關閉
}
python3.dll 嵌入 或 pybind11 綁定,生態免費、部署輕量,現代專案首選C++Builder + MATLAB Engine 混合開發曾是科學工程軟體的經典組合。隨著 Python 生態崛起,新專案建議評估 Python 嵌入方案;既有 MATLAB 資產專案,本文架構仍具參考價值。