程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++Builder調用Matlab

C++Builder調用Matlab

編輯:關於C++

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。以下是操作過程:

1. 在頭文件中加入Engine.h。其包含了啟動Matlab調用和關閉的函數聲明。

2. 打開Project|Option...對話框,點擊Directories/Conditionals。

● 在Include Path中,加入目錄路徑<matlab>\extern\include,該路徑包含了engine.h和matlab.h等有用的頭文件。

● 在Library Path中,加入<matlab>\bin和<matlab>\extern\include。這兩個目錄路徑包含了可外部調用的DLL和LIB文件。

3. 點選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處加寫需要的語句即可。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved