VC++與Matlab混合編程之引擎操做詳解

Visual C++是當前主流的應用程序開發環境之一,開發環境強大,開發的程序執行速度快。但在科學計算方面函數庫顯得不夠豐富、讀取、顯示數據圖形不方便。Matlab是一款將數值分析、矩陣計算、信號處理和圖形顯示結合在一塊兒,包含大量高度集成的函數可供調用,適合科學研究、工程設計等衆多學科領域使用的一種簡潔、高效的編程工具。不過因爲Matlab使用的是解釋性語言,大大限制了它的執行速度和應用場合。基於VC和Matlab混合編程是不少熟悉VC++編程而又須要進行科學計算、數據仿真的科研人員經常使用的一種方式,其中最簡單也最直接的方法就是調用Matlab引擎。本文如下部分將詳細介紹經過VC++6.0調用Matlab6.5引擎來達到VC++與Matlab數據共享編程的方法。

1. 什麼是Matlab引擎

所謂Matlab引擎(engine),是指一組Matlab提供的接口函數,支持C/C++、Fortran等語言,經過這些接口函數,用戶能夠在其它編程環境中實現對Matlab的控制。能夠主要功能有:

★ 打開/關閉一個Matlab對話;

★ 向Matlab環境發送命令字符串;

★ 從Matlab環境中讀取數據;

★ 向Matlab環境中寫入數據。

與其它各類接口相比,引擎所提供的Matlab功能支持是最全面的。經過引擎方式,應用程序會打開一個新的Matlab進程,能夠控制它完成任何計算和繪圖操做。對全部的數據結構提供100%的支持。同時,引擎方式打開的Matlab進程會在任務欄顯示本身的圖標,打開該窗口,能夠觀察主程序經過engine方式控制Matlab運行的流程,並可在其中輸入任何Matlab命令。

實際上,經過引擎方式創建的對話,是將Matlab以ActiveX控件方式啓動的。在Matlab初次安裝時,會自動執行一次:

matlab /regserver

將本身在系統的控件庫中註冊。若是由於特殊緣由,沒法打開Matlab引擎,能夠在Dos命令提示符後執行上述命令,從新註冊。

2. 配置編譯器

要在VC中成功編譯Matlab引擎程序,必須包含引擎頭文件engine.h並引入Matlab對應的庫文件libmx.lib、libmat.lib、libeng.lib。具體的說,打開一個工程後,作以下設置(以VC6爲例):

1) 經過菜單工程/選項,打開設置屬性頁,進入Directories頁面,在目錄下拉列表框中選擇Include files,添加路徑:"C:\matlab\extern\include"(假定matlab安裝在C:\matlab目錄)。

2) 選擇Library files,添加路徑:C:\matlab\extern\lib\win32\microsoft\msvc60。

3) 經過菜單工程/設置,打開工程設置屬性頁,進入Link頁面,在Object/library modules編輯框中,添加文件名libmx.lib libmat.lib libeng.lib。

以上步驟1)、2)只需設置一次,而步驟3)對每一個工程都要單獨設定,對於其它C++編譯器如Borland C++ builder,設置大致相同,再也不贅述。

3. 引擎API詳解

在調用Matlab引擎以前,首先應在相關文件中加入一行:#include "enging.h",該文件包含了引擎API函數的說明和所需數據結構的定義。能夠在VC中調用的引擎函數分別以下:

3.1 引擎的打開和關閉

engOpen-打開Matlab engine

函數聲明:

編程

Engine *engOpen(const char *startcmd);


參數startcmd是用來啓動Matlab引擎的字符串參數,在Windows操做系統中只能爲NULL。

函數返回值是一個Engine類型的指針,它是在engine.h中定義的engine數據結構。

EngClose-關閉Matlab 引擎

函數聲明:

數組

int engClose(Engine *ep);


參數ep表明要被關閉的引擎指針。

函數返回值爲0表示關閉成功,返回1表示發生錯誤。

例如,一般用來打開/關閉Matlab引擎的代碼以下:

數據結構

Engine *ep; //定義Matlab引擎指針。
if (!(ep=engOpen(NULL))) //測試是否啓動Matlab引擎成功。
{
MessageBox("Can't start Matlab engine!" );
exit(1);
}
. …………
engClose(ep); //關閉Matlab引擎。


3.2 向Matlab發送命令字符串

engEvalString-發送命令讓Matlab執行。

函數聲明:

函數

int engEvalString(Engine *ep, Const char *string);


參數ep爲函數engOpen返回的引擎指針,字符串string爲要matlab執行的命令。

函數返回值爲0表示成功執行,返回1說明執行失敗(如命令不能被Matlab正確解釋或Matlab引擎已經關閉了)。

3.3 獲取Matlab命令窗口的輸出

要在VC中得到函數engEvalString發送的命令字符串被Matlab執行後在matlab窗口中的輸出,能夠調用engOUtputBuffer函數。

函數聲明:

工具

int engOutputBuffer(Engine *ep, char *p, int n);


參數ep爲Matlab引擎指針,p爲用來保存輸出結構的緩衝區,n爲最大保存的字符個數,一般就是緩衝區p的大小。該函數執行後,接下來的engEvalString函數所引發的命令行輸出結果會在緩衝區p中保存。若是要中止保存,只需調用代碼:engOutputBuffer(ep, NULL, 0)。

3.4 讀寫Matlab數據

3.4.1從Matlab引擎工做空間中獲取變量。

測試

mxArray *engGetVariable(Engine *ep, const char *name);


參數ep爲打開的Matlab引擎指針,name爲以字符串形式指定的數組名。

函數返回值是指向name數組的指針,類型爲mxArray*(mxArray數據類型在本文第4節詳細簡介)。

3.4.2 向Matlab引擎工做空間寫入變量。

ui

int engPutVariable(Engine *ep, const char *name, const mxArray *mp);


參數ep爲打開的Matlab引擎指針,mp爲指向被寫入變量的指針,name爲變量寫入後在Matlab引擎工做空間中的變量名。
函數返回值爲0表示寫入變量成功,返回值爲1表示發生錯誤。

3.5 調用引擎時顯示/隱藏Matlab主窗口

默認狀況下,以engine方式調用Matlab的時候,會打開Matlab主窗口,可在其中隨意操做。但有時也會干擾應用程序的運行,可用如下設置是否顯示該窗口。

操作系統

int engSetVisible(Engine *ep, bool value);


參數ep爲打開的Matlab引擎指針,value爲是否顯示的標誌,取值true(或1)表示顯示Matlab窗口,取值false(或0)表示隱藏Matlab窗口。

函數返回值爲0表示設置成功,爲1表示有錯誤發生。

要得到當前Matlab窗口的顯示/隱藏狀況,能夠調用函數:

命令行

int engGetVisible(Engine *ep, bool *value);


參數ep爲打開的Matlab引擎指針,Value爲用來保存顯示/隱藏狀況的變量(採用指針方式傳遞)。

函數返回值爲0表示獲取成功,爲1表示有錯誤發生。

設計

相關文章
相關標籤/搜索