• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • C++Builder 調用Matlab

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    國防科技大學機電工程與儀器系 張云洲 Borland C ++Builder 是一種新穎的可視化編程語言。在工程應用中,我們一般用C ++Builder 語言編寫應用程序,實現交互界面、數據采集和端口操作等,但C ++Builder 在數值處理分析和算法工具等方面,其效率遠遠低于
    國防科技大學機電工程與儀器系 張云洲

      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 屬性而加以隱藏。  

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>