Visual C++ 作為主流應用程式開發環境,擁有強大的開發工具與極快的執行速度,但在科學計算領域,其函式庫相對匱乏,數據讀取與圖形顯示也較為不便。相對地,Matlab 將數值分析、矩陣運算、訊號處理與圖形顯示高度整合,提供大量優化的函式庫,非常適合科學研究與工程設計。然而,Matlab 使用解釋型語言,執行速度與應用場合受限。因此,結合 VC++ 的高效執行與 Matlab 的強大計算能力,成為許多科研人員的首選方案。其中,調用 Matlab Engine(引擎)是最簡單直接的混合編程方式。
Matlab Engine 是一組 Matlab 提供的介面函式,支援 C/C++、Fortran 等語言。透過這些介面,開發者可在其他程式環境中控制 Matlab,主要功能包括:
與其他介面相比,Engine 提供最全面的 Matlab 功能支援。應用程式會啟動一個新的 Matlab 進程,可控制其進行任意計算與繪圖操作,對所有數據結構提供 100% 支援。Engine 方式啟動的 Matlab 進程會在工作列顯示圖示,開啟視窗可觀察主程式控制 Matlab 的執行流程,甚至可在其中手動輸入 Matlab 指令。
Engine 實際上是以 ActiveX 控制項方式啟動 Matlab。Matlab 安裝時會自動執行 matlab /regserver 向系統控制項庫註冊。若無法啟動 Engine,可在命令提示字元重新執行此指令完成註冊。
要在 VC 中成功編譯 Matlab Engine 程式,必須包含 engine.h 標頭檔並連結 libmx.lib、libmat.lib、libeng.lib 三個庫檔。具体配置如下:
選單 專案/選項 → Directories 頁面 → 下拉選單選 Include files → 新增路徑:C:\matlab\extern\include(假設 Matlab 安裝於 C:\matlab)。
同頁面下拉選單選 Library files → 新增路徑:C:\matlab\extern\lib\win32\microsoft\msvc60。
選單 專案/設定 → Link 頁面 → Object/library modules 編輯框新增:libmx.lib libmat.lib libeng.lib。
注意: 步驟 1、2 只需設定一次,步驟 3 每個專案需單獨設定。其他編譯器(如 Borland C++ Builder)設定大同小異。
| 函式 | 功能說明 |
|---|---|
engOpen | 啟動 Matlab Engine 會話,傳回 Engine 指標 |
engClose | 關閉 Engine 會話 |
engEvalString | 向 Matlab 發送命令字串執行 |
engGetVariable | 從 Matlab 工作區讀取變數 |
engPutVariable | 向 Matlab 工作區寫入變數 |
engOutputBuffer | 設定輸出緩衝區捕獲 Matlab 命令視窗輸出 |
#include <stdio.h>
#include <stdlib.h>
#include "engine.h"
int main() {
Engine *ep;
mxArray *mxData = NULL;
double data[] = {1.0, 2.0, 3.0, 4.0, 5.0};
int ndim = 1, dims[1] = {5};
char buffer[256];
// 1. 啟動 Engine
if (!(ep = engOpen(NULL))) {
fprintf(stderr, "無法啟動 Matlab Engine\n");
return 1;
}
// 2. 設定輸出緩衝區
engOutputBuffer(ep, buffer, sizeof(buffer));
// 3. 建立 mxArray 並寫入 Matlab
mxData = mxCreateNumericArray(ndim, dims, mxDOUBLE_CLASS, mxREAL);
memcpy(mxGetPr(mxData), data, 5 * sizeof(double));
engPutVariable(ep, "vcData", mxData);
// 4. 在 Matlab 中處理數據並繪圖
engEvalString(ep, "plot(vcData, 'r-o'); title('VC++ 傳遞數據繪圖'); grid on;");
engEvalString(ep, "matlabData = vcData .^ 2;"); // 平方運算
// 5. 從 Matlab 讀取結果
mxArray *result = engGetVariable(ep, "matlabData");
double *resData = mxGetPr(result);
printf("Matlab 回傳結果: ");
for (int i = 0; i < 5; i++) printf("%.2f ", resData[i]);
printf("\n");
// 6. 清理資源
mxDestroyArray(mxData);
mxDestroyArray(result);
engClose(ep);
return 0;
}
確認 Matlab 安裝路徑正確,且 VC 專案屬性中包含目錄與庫目錄設定無誤。Matlab 版本不同,庫檔路徑可能有差異(如 msvc60、msvc71、win64 等)。
以系統管理員身份執行命令提示字元,輸入 matlab /regserver 重新註冊 ActiveX 控制項。
大量數據傳遞時,建議:
mxCreateNumericMatrix 直接建立矩陣避免多次複製engGetLastError 獲取詳細錯誤資訊。engOpen("-nojvm") 啟動無 JVM 的輕量級 Engine,加快啟動速度。VC++ 與 Matlab 混合編程透過 Engine 介面,能完美結合兩者優勢:VC++ 負責高效的介面與邏輯控制,Matlab 專注科學計算與視覺化。掌握 Engine 核心 API 與配置技巧,即可構建高性能的科學工程應用系統。