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

VC++與MATLAB混合編程及其應用

編輯:關於VC++

摘 要 本文詳述了在VC++6.0編譯環境下如何利用Matlab來實現應用系統的設計和分析, 介紹了通過Matlab與VC應用程序連接的常用方法,分析了VC與Matlab的混合編程的步驟,最 後通過一個具體實例的實現過程對上述方法進行了應用性介紹。

關鍵詞 VC++; Matlab;混合編程

Matlab 是由Math Works 公司於1984 年推出的數值計算及圖形處 理軟件,可以實現數值分析、優化、統計、偏微分方程數值解、自動控制、信號處理、圖像 處理等若干領域的計算和圖形顯示功能。其中,控制系統工具箱的集成為設計和分析各種復 雜的控制系統提供了有效的方法和途徑。

但是,由於Matlab開發平台的局限性,在其 上面開發的程序不能脫離Matlab運行環境,因而在處理一些實際應用問題時顯得靈活性不足 ,而VC++則在一定程度上能夠彌補這一漏洞,因此,現將二者結合共用,各獻其長,可以為 科研工作和工程開發提供了更為強大的技術支持。

1、Matlab與VC混合編程的實現方 法

Matlab作為控制系統設計的一種通用工具,它可以和VC方便的進行連接。一般而言 ,Matlab與VC混合編程的實現方法主要有以下三種方法:(1)通過引擎(Engine),采用客 戶機服務器的計算模式,通過Window的ActiveX通道和Matlab進行連接。具體應用時,往往在 VC中設計程序框架,以編譯的程序作為前端客戶機;通過調用Matlab引擎在後台實現與服務 器的連接,實現動態通信(2)應用Matlab數學函數庫,Matlab中包含了內容豐富的函數庫, 而且還提供了與VC的數學函數接口,用戶可以方便的在VC的IDE(集成開發環境)中調用。( 3)通過DLL實現VC與Matlab的混合編程。DLL是一個可執行的二進制文件。把很多通用的功能 放在DLL中,可以供多個應用程序調用,這樣可以很好的減少外部存儲空間的占有量,並實現 代碼的共享[2]。在上述三種方法中,第一種方法對調用Matlab的工具箱很實用,所有在進行 控制系統的設計和分析時,一般都是通過調用Matlab引擎(Engine)來實現的。本文主要介 紹采用通過引擎(Engine)來實現VC與Matlab的混合編程。

2、MATLAB引擎簡介

Matlab引擎是Matlab提供的一系列程序的結合,它允許用戶在自己的應用程序中對 Matlab進行調用,將Matlab作為一個操作引擎使用,使其在後台運行。一般Matlab 引擎采用 客戶機/ 服務器(Client/ Sever) 計算方式,就是一種把應用處理負載分布到客戶機和服務 器上的一種計算模式,客戶機和服務器既可以是存在於同一台計算機,也可以通過網絡來實 現信息共享。一般情況下,客戶機是運行前端軟件的PC機,並且知道如何與服務器通信,服 務器與此相對應,是接收請求信息,並采取相應行的機器。由於客戶機和服務器共同承擔處 理負載,使系統總體性能大為提高。在實際應用過程中,把VC的C語言或C + + 語言的程序作 為前端客戶機程序,它從Matlab 引擎接收數據信息,並與引擎傳遞命令的數據信息。表1是幾 種常用的Matlab引擎調用函數。

表1 Matlab引擎常用調用函數

通過Matlab引擎 用戶可以完成以下任務:首先,可以將Matlab作為一個功能強大的和可編程的數學函數庫, 調用Matlab中的大量的數學計算函數,完成復雜的計算任務;其次,可以為一個特定的任務 構建一個完整的系統,前台的用戶界面用高級語言編寫,後台的計算任務由Matlab引擎來完 成;最後,用戶不但可以在本地計算機上調用Matlab引擎,而且還可以通過網絡調用其它計 算機上的Matlab引擎,這樣可以很好的實現資源的共享和作業的分工合作。

3、 Matlab引擎實現VC和Matlab混合編程的步驟

要想在VC集成環境下利用Matlab引擎實現 VC和Matlab的混合編程,一般需要經過以下幾個必要的步驟:

(1)Visual C++6.0 編譯環境的設置:通過菜單 Tools/ Options,打開Visual C++6.0設置屬性頁,進入 Directorie頁面,在 Show Directories for下拉列表中選擇Include Files,添加路徑:D:\Matlab6p5\extern\include(在Matlab的安裝路徑下);再選擇下拉列表中的 Library Files,添加路徑:D:\Matlab6p5\extern\ lib\win32\Microsoft\msvc60(在Matlab的安裝路徑下)。編譯環境只需設置一次。

(2)添加庫文件: 通過菜單 Projects|settings,進入 Link 頁面,在 Object/Library Modules 框中,添加庫文件名:libmx.lib 、libmat.lib 、libeng.lib。每個新的工程文件都要單獨添加庫文件。

(3)在使用 engine 函數 的程序頭文件中包含如下兩個頭文件:

#include "engine.h"
#include <stdlib.h>

(4)在應用程序中添加調用Matlab引擎的程序代 碼:

{
Engine *ep;
if(!(ep=engOpen(" \0"))) //打開Matlab引擎,建立與本地Matlab的連接
{
fprintf(stderr,"\n Can't start MATLAB engine\n");
exit(-1);
}

以上 步驟是對VC與Matlab混合編程的編譯環境進行設置,在完成了以上基本步驟後就可以利用 Matlab引擎庫函數engEvalString來調用Matlab的內建函數了。

4、VC與Matlab混合編 程應用實例

根據上面的方法,下面通過一個具體的實力來說明如何實現VC與Matlab混 合編程、它們之間的數據通信以及VC環境下對Matlab命令的調用。

首先,利用 VC++6.0的MFC建立一個單文檔結構的應用程序,加入一個菜單資源,為其映射相應的功能函 數;

其次,根據Matlab引擎實現VC和Matlab的混合編程步驟(見第三部分)為程序設 置相應的編譯環境並添加連接庫函數;

然後,調用Matlab的內建函數和命令,主要編 寫程序代碼如下:


static double Areal[6]={1,2,3,4,5,6};
mxArray *T=NULL,*a=NULL,*d=NULL;
double time[10]={0,1,2,3,4,5,6,7,8,9};
/*利用mx函數庫創建矩陣,傳遞參數。*/
T=mxCreateDoubleMatrix (1,10,mxREAL);
memcpy((char*)mxGetPr(T),(char*)time,10*sizeof(double));
/*通過上面創建的Matlab Engine連接句柄將參數傳遞給Server端*/
engPutVariable(ep,"T",T);
/*調用Matlab內建的函數和指令*/
engEvalString(ep,"D=.5.*(-9.8).*T.^5;");
engEvalString (ep,"plot(T,D);");

最後,添加頭文件: #include "matlab.h"

編譯運行,就可以得到如(圖1)所示的 結果。

圖1 調用Matlab引擎輸出結果

上面例子是VC和Matlab的混合編程的一個簡單應 用,在實際的數值計算,控制系統開發等工程應用中,可以很好的利用VC和Matlab的混合編 程技術,從而簡化應用程序的開發工作量。

5、結論

Matlab提供了強大的數學 計算功能和豐富的工具箱, 使用VC和Matlab的混合編程, 可以發揮各自特長, 縮短工程應用 軟件的開發周期, 同時也提高了程序的運行效率。其中,基於客戶機/服務器計算模式的 Matlab引擎是實現VC與Matlab 混合編程的一種常用方法。通過對引擎調用與數據組織方式的 面向對象的設計,將數據組織透明化,極大地簡化了程序設計過程, 封裝了對Matlab 引擎的訪 問和與Matlab 服務器進行數據交換的細節,為用戶提供了一個友好的編程接口環境。

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