在C、C++中調用Matlab

  Matlab是美國MathWorks公司的產品,是一種以矩陣爲基本編程單位的高效數值計算語言。Matlab集科學計算、圖像處理、聲音處理於一體,爲用戶提供了豐富的Windows圖形界面設計方法,使用戶能夠在利用其強大數值計算功能的同時設計出友好的圖形界面
 。Matlab已經被證明是在應用數學、物理、工程學和其它涉及複雜數值計算等應用領域中解決問題的優秀工具。Matlab能夠在Win95/98、Win2000、Linux和Unix等多種操作系統平臺上運行。
  C、C++是衆多程序員十分喜愛的高級程序設計語言,但其在數值處理分析和算法工具等方面,效率遠遠低於Matlab 語言;在準確方便地繪製數據圖形方面,Matlab 語言具有C和C++無法比擬的優勢。但Matlab作爲一種以解釋方式運行的計算機語言,其程序的執行效率較低,而且不能實現端口操作和實時控制。因此,若能將兩者結合運用,實現優勢互補,將獲得極大的效益。爲此,MathWorks公司提供了Matlab和C、C++的接口。通過接口,用戶既可在C程序中調用Matlab的函數,也可在Matlab中調用C或C++程序,從而實現Matlab和C、C++的混合編程。本文主要討論如何在C、C++中調用Matlab。
  一、過程分析
  在C、C++中調用Matlab的主要過程如下所示:
  1) 首先調用engOpen函數打開一個Matlab工程。
  2) 生成mxArray。
  在Matlab中,所有變量類型,如標量、向量、矩陣、字符串、細胞矩陣和結構,都以mxArrays形式來保存,固數據操作都必須通過這些mxArrays來完成。生成mxArray有兩種不同的方式。一是用mxCreate函數來創建矩陣,之後用mxSetName函數對它進行命名。
 另一種方式是選擇將一個自定義的數據結構複製到mxArray中,值得注意的是Matlab在存儲矩陣時是按列序保存的,而在C、C++中是按行序保存的,所以轉換時注意分清下標。
  3) 調用engPutArray函數將矩陣放入到Matlab工作區中。
  4) 通過engEvalString函數向Matlab傳遞命令,如果成功,函數返回值爲此0,否則返回一個非0值。
  5) 將Matlab中的運行結果回傳給C、C++
  二、程序實現
  我們通過一個簡單的程序demo.c來說明C、C++對Matlab的調用。
  #include
  #include
  #include
  #include
  /*在頭文件中加入engine.h。其包含了調用的Matlab函數聲明。*/
  #include "engine.h"
  int PASCAL WinMain (HANDLE hInstance,
  HANDLE hPrevInstance,
  LPSTR lpszCmdLine,
  int nCmdShow)
  {
  Engine *ep; // 定義Matlab 引擎
  mxArray *a_ptr=NULL;
  char buffer[300]; // 定義數據緩衝區
  double *wu;
  int i,j;
  /*創建一個新矩陣*/
  a_ptr=mxCreateDoubleMatrix(10,10,mxREAL);
  mxSetName(a_ptr,"wu");
  wu=mxGetPr(a_ptr);
  for(i=0;i<10;i++)
  {
  for(j=0;j<10;j++)
  {
  wu[i+10*j]=(j+1)*(j+1)*(i+1)*(i+1);
  }
  }
  /* 打開Matlab 引擎*/
  if (!(ep = engOpen(NULL))) {
  MessageBox ((HWND)NULL, (LPSTR)"Can't start Matlab engine",
  (LPSTR) "demo.c", MB_OK);
  exit(-1);
  }
  /*傳遞新矩陣*/
  engPutArray(ep, a_ptr);
  /*畫出圖形並保存*/
  engEvalString(ep,"mesh(wu);");
  engEvalString(ep,"print picture.eps -deps;");
  /* 獲取Matlab 輸出 */
  engOutputBuffer(ep, buffer, 300);
  /*關閉Matlab 引擎,結束調用*/
  engClose(ep);
  mxDestroyArray(a_ptr);
  return(0);
  }
  當然,該程序在編譯之前還需設置一些環境參數。在不同的開發環境中,其設置方法略有差異,我們以Borland C++ builder開發平臺爲例加以說明。
  1) 首先必須完成Matlab中鏈接庫的導入工作。在Matlab\extern\include中存在_libmx.def、_libmat.def、_libeng.def等定義文件,在DOS環境中對它們執行命令:
  c:\matlab\extern\include>implib 文件名.lib 文件名.def 將獲得_libmx.lib、_libmat.lib、_libeng.lib等新文件。再將這3個新文件拷貝到 目錄matlab\extern\
lib中即可。
  2)在BCB中新建一工程,在其中加入文件demo.c
  3)打開Project|Option... 對話框,點擊Directories/Conditionals。在Include Path 中,加入目錄路徑\extern\include,該路徑包含了engine.h 和matlab .h 等有用的頭文件。在Library Path 中,加入\bin和\extern\lib 。這兩個目錄路徑包含了外部調用的LIB文件。
  4)點選Project|Add to Project... 對話框,加入如下庫文件:
    _libeng.lib,_libmat.lib 和_libmx.lib。
  完成以上配置後,即可編譯運行。程序執行結果如下圖所示。
  最後,需要說明的是,使用這種方法調用Matlab 不能脫離Matlab 環境的支撐。另一種方法則是完全脫離Matlab環境,通過動態連接庫方式實現對Matlab工具箱函數的調用,這可以通過Mathtools公司的開發平臺Mediva來實現。Mediva軟件功能相當強大,提供近千個Matlab的基本功能函數,通過一些必要的設置,就可以直接實現與C、C++的混合編程,而不必再依賴Matlab。限於篇幅,在此不作詳細介紹,感興趣的用戶可以通過訪問網站www.mathtools.com免費下載試用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章