Borland C
++Builder
是一種新穎的可視化編程語言。在工程應用中,我們一般用C ++Builder
語言編寫應用程序,實現交互界面、數據采集和端口操作等,但C
++Builder 在數值處理分析和算法工具等方面,其效率遠遠低于Matlab
語言。在準確方便地繪制數據圖形方面,Matlab
語言更具有無可比擬的優勢。此外,Matlab
還提供功能強大的工具箱。但Matlab
的缺點是不能實現端口操作和實時控制。因此,若能將兩者結合運用,實現優勢互補,將獲得極大的效益。
本文結合實際介紹了應用Borland C ++Builder3.0 開發的Windos
應用程序中,對Matlab 的調用方法。
一、C ++Builder 調用Matlab 的實現方案
1. 實現思路
在高版本的Matlab 中(如Matlab V4.2)提供了DDE
接口,用戶可以通過Windows 的DDE
通信基制實現外部調用。這種實現方式比較簡單,但將增大主程序代碼,影響運行速度。
在Windows 系統中,DLL 是一種很特別的可執行文件,可以被多個Windows
應用程序同時訪問,具有固定的共享數據段。該數據段的數據在DLL
被Windows 下載前會一直保留在內存中,因此可以通過DLL
實現用戶程序與Matlab 之間的數據傳輸和函數調用。
具體地說,就是利用Matlab 的32 位動態連接庫(DLL),生成相應的可以被C
++Builder 調用的DLL,用來提供二者之間的基本支撐環境。只需在用戶程序中加載該DLL,即可實現其數據段的共享。然后在用戶程序中操作DLL
數據段的數據,并通過某種方式在用戶程序中使Matlab 執行該DLL,就可實現用戶程序對Matlab
的調用。其形式可以是混合編程或函數調用,非常方便而高效。
2. 實現方式
Matlab 提供了可外部連接的DLL 文件,通過將其轉換為相應的Lib
文件,并加以必要的設置,就可以在C ++Builder 中直接進行Matlab
函數調用,實現C ++Builder 語言與Matlab 語言的混合編程。
(1) 運行環境要求
由于Matlab 提供的是32 位的DLL。其運行環境要求是Matlab V4.2
或更高版本。C ++Builder 可以進行32 位編程,這里我們采用的是V3.0
版本。
(2) C ++Builder 下LIB 文件的生成
Matlab 提供的Def 文件允許用戶通過Implib 命令生成相應的Lib
文件。其命令格式為:
Implib ???.lib ???.def
在< matlab >\extern\include 目錄下,提供了如下三個.Def 文件:
_libeng.def,_libmat.def,_libmx.def
通過上述命令可以生成相應的三個Lib 文件。這些Lib
文件中包含了可外部調用的Matlab 函數的必要信息。
二、實現計算和繪圖
為清楚起見,通過一個簡單的CBuilder
例程進行說明。該實例通過調用Matlab
實現矩陣運算并繪制圖形,來演示C ++Builder 對Matlab 的調用。
在C ++Builder 編輯環境中,建立一個新的窗體MyForm,并放置一個按鈕Demo。將工程文件命名為Try.prj,其主函數為try.cpp。在主函數中,我們將使用一個實現Matlab
調用的子函數DemoMatlab,作為按鈕Demo 的響應事件。其源代碼如下:
#include < vcl.h >
#pragma hdrstop
#include "Unit1.h"
#pragma package(smart_init)
#pragma resource "*.dfm"
TMyForm *MyForm;
__fastcall TMyForm::TMyForm(TComponent *Owner)
: TForm(Owner)
{
}
void __fastcall TMyForm::DemoClick(TObject *Sender)
{
DemoMatlab(); // 演示Matlab 語言調用
}
為了調用Matlab
中的函數,必須進行必要的設置,將包含這些函數的文件加入工程文件Try.prj。以下是操作過程:
在頭文件中加入Engine.h。其包含了啟動Matlab 調用和關閉的函數聲明。
打開Project|Option... 對話框,點擊Directories/Conditionals。
在Include Path 中,加入目錄路徑< matlab >\extern\include,該路徑包含了engine.h
和matlab.h 等有用的頭文件。
在Library Path 中,加入< matlab >\bin 和< matlab >\extern\include。這兩個目錄路徑包含了可外部調用的DLL
和LIB 文件。
點選Project|Add to Project... 對話框,加入如下庫文件:
_libeng.lib,_libmat.lib 和_libmx.lib。
在進行了這些必要的設置之后,我們就可以選用適當的函數來實現目標。以下是子函數DemoMatlab
的程序代碼。
void DemoMatlab
{
Engine *eng; // 定義Matlab 引擎
char buffer[200]; // 定義數據緩沖區
int array[6]={1,2,3,4,5,6};
mxArray *S = NULL, *T = NULL;
engOpen(NULL); // 打開MATLAB 引擎---1
S= mxCreateDoubleMatrix(1,6, mxREAL);
// 產生矩陣變量
mxSetName(S, "S");
memcpy((char *) mxGetPr(S),(char *) array,
6 *sizeof(int));
engPutArray(eng, S);
// 將變量X 置入Matlab 的工作空間
engEvalString(eng, "T = S/S.^2;"); // 計算
engEvalString(eng, "plot(S, T);"); // 繪制圖形
...... ......
engOutputBuffer(eng, buffer, 200); // 獲取Matlab 輸出
T = engGetArray(eng, "T");
// 獲得計算結果----2
engClose(eng);
// 關閉Matlab 引擎,結束調用
mxDestroyArray(S); // 釋放變量
mxDestroyArray(T);
}
若還需要執行其他功能和任務,那么按照上面介紹的方法,進行變量聲明后,在1、2
處加寫需要的語句即可。
當然,使用這種方法調用Matlab 不能脫離Matlab
環境的支撐。但當我們不需要看到Matlab 的命令窗口時,可將其賦予Swhide
屬性而加以隱藏。