《電子技術應用》
您所在的位置:首頁 > 模擬設計 > 設計應用 > Matlab與C/C++混合編程接口及應用
Matlab與C/C++混合編程接口及應用
摘要: 本文從Matlab調用C/C++代碼和C/C+調用m文件兩方面,詳細地研究了Matlab與C/C++混合編程技術。對于Matlab調用C/C++代碼,給出了常用的MEX技術和調用C/C++動態連接庫的方法,并對它們進行比較。
Abstract:
Key words :

  1 引言

  Matlab 是當前應用最為廣泛的數學軟件,具有強大的數值計算、數據分析處理、系統 分析、圖形顯示甚至符號運算等功能。利用這一完整的數學平臺,用戶可以快速實現十分 復雜的功能,極大地提高工程分析計算的效率。但與其他高級程序相比,Matlab 程序 是一種解釋執行程序,不用編譯等預處理,程序運行速度較慢。

  C/C++語言是目前最為流行的高級程序設計語言之一。它可對操作系統和應用程序以 及硬件進行直接操作,用C/C++語言明顯優于其它解釋型高級語言,一些大型應用軟件如 Matlab 就是用C 語言開發的。

  在工程實踐中,用戶經常遇到Matlab 與C/C++混合編程的問題。本文基于Matlab 6.5和VC6.0 開發環境,在Windows 平臺下就它們之間的混合編程問題進行深入研究并舉例說明。

  2 Matlab 調用C/C++

  Matlab 調用C/C++的方式主要有兩種:利用MEX 技術和調用C/C++動態連接庫。

  在Matlab 與C/C++混合編程之前,必須先對Matlab 的編譯應用程序mex 和編譯器mbuild進行正確的設置:

  對Matlab 編譯應用程序mex 的設置:Mex –setup.

  對Matlab 編譯器mbuild 的設置:Mbuild –setup.

  2.1 調用C/C++的MEX 文件

  MEX 是Matlab Executable 的縮寫,它是一種“可在Matlab 中調用的C(或Fortran)語 言衍生程序”。MEX 文件的使用極為方便,其調用方式與Matlab 的內建函數完全相同,只 需在Matlab 命令提示符下鍵入MEX 文件名即可。

  一個C/C++的MEX源程序通常包括4個組成部分,其中前3個是必須包含的內容,第4個則根據所實現的功能靈活選用1)#include “mex.h”;(2)MEX文件的入口函數mexFunction, MEX文件導出名必須為mexFunction函數;(3)mxArray;(4)API函數

  通過簡單的例子說明C/C++的MEX 源程序編寫和調用過程:

  #include “mex.h”

  void timestwo(double y[], double x[])

  { y[0] = 2.0*x[0]; }

  void mexFunction(int nlhs, mxArray *plhs[],int nrhs, const mxArray *prhs[] )

  { double *x,*y; int mrows,ncols;

  if(nrhs!=1) mexErrMsgTxt(“One input required.”);

  else if(nlhs》1) mexErrMsgTxt(“Too many output arguments”);

  mrows = mxGetM(prhs[0]);ncols = mxGetN(prhs[0]);

  if( !mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||?。╩rows==1 && ncols==1))

  mexErrMsgTxt(“Input must be a noncomplex scalar double.”);

  plhs[0]=mxCreateDoubleMatrix(mrows,ncols, mxREAL);

  x=mxGetPr(prhs[0]); y=mxGetPr(plhs[0]); timestwo(y,x); }

  用指令mex timestwo.c 編譯此文件,然后在MATLAB 命令行下調用生成的MEX 文件即可。

  2.2 調用C/C++動態連接庫

  Matlab 提供對動態連接庫DLL 文件的接口。利用該接口,可在Matlab 中調用動態連 接庫導出的函數。Matlab 對DLL 的接口支持各種語言編寫的DLL 文件。在調用DLL 文件之 前,需要準備函數定義的頭文件。對于C/C++語言開發的DLL 文件,可使用源程序中相應的 頭文件;而對于其他語言開發的DLL,則要手工準備等效的C 語言函數定義頭文件。

  在Matlab 中利用動態連接庫接口技術通常需要完成以下4 個步驟:

 ?。?)打開動態連接庫文件;(2)為調用函數準備數據;(3)調用動態連接庫文件中導出的 函數;(4)關閉動態連接庫文件。

  為了實現以上步驟,用到的Matlab 函數有:loadlibrary,loadlibrary,calllib, libfunctions,lipointer,libstruct,libisloaded。下面舉例說明Matlab 調用C/C++動態 連接庫的方法和步驟:

  a.在VC 環境下,新建工程-》win32 動態連接庫-》工程名Test1-》empty 工程-》完成;

  b.新建-》C++源文件-》添加a.cpp,內容為: #include “a.h”

  _declspec(dllexport) int add(int a, int b) { return a+b; }

  c.新建-》C/C++頭文件-》添加a.h,內容為: _declspec(dllexport) int add(int a,intb);然后編譯生成Test1.dll 動態連接庫文件,將Test1.dll 和a.h 拷到Matlab 工作目錄下。

  d.在Matlab 命令行下,調用Test.dll:》》loadlibrary(‘Test1’,’a.h’); 》》x=7;

  》》y=8; 》》calllib(‘Test1’,‘add’,x,y); Ans=15 》》unloadlibrary(‘Test1’)。

  調用DLL 動態連接庫的方法,為Matlab 重用工程實踐中積累的大量實用C/C++代碼提供了一種簡潔方便的方法。與調用MEX 文件相比,該方法更加簡便實用。

  3 C/C++調用Matlab

  在工程實踐中,C/C++調用Matlab 的方法主要有調用Matlab 計算引擎、包含m 文件轉 換的C/C++文件,以及調用m 文件生成的DLL 文件。

  3.1 利用Matlab 計算引擎

  Matlab 的引擎庫為用戶提供了一些接口函數,利用這些接口函數,用戶在自己的程序 中以計算引擎方式調用Matlab 文件。該方法采用客戶機/服務器的方式,利用Matlab 引擎 將Matlab 和C/C++聯系起來。在實際應用中,C/C++程序為客戶機,Matlab 作為本地服務器。

  C/C++程序向Matlab 計算引擎傳遞命令和數據信息,并從Matlab 計算引擎接收數據信息。

  Matlab 提供了以下幾個C 語言計算引擎訪問函數供用戶使用:engOpen,engClose, engGetVariable,engPutVariable,engEvalString,engOutputBuffer,engOpenSingleUse, engGetVisible,engSetVisible。

  下面以C 語言編寫的、調用Matlab 引擎計算方程x3 ?2x+5=0根的源程序example2.c 為 例,說明C/C++調用Matlab 計算引擎編程的原理和步驟:

  #include #include

  #include #include “engine.h”

  int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,

  LPSTR lpszCmdLine, int nCmdShow)

  { Engine *ep; mxArray *P=NULL,*r=NULL;

  char buffer[301]; double poly={1,0,-2,5};

  if (?。╡p=engOpen(NULL)))

  {fprintf(stderr,“\nCan‘t start MATLAB engine\n”); return EXIT_FAILURE;}

  P=mxCreateDoubleMatrix(1,4,mxREAL); mxSetClassName(P,“p”);

  memcpy((char *)mxGetPr(P),(char *)poly, 4*sizeof(double));

  engPutVariable(ep,P); engOutputBuffer(ep,buffer,300);

  engEvalString(ep,“disp([’多項式‘,poly2str(p,’x‘),’的根‘]),r=roots(p)”);

  MessageBox(NULL,buffer,“example2 展示MATLAB 引擎的應用”,MB_OK);

  engClose(ep); mxDestroyArray(P); return EXIT_SUCCESS; }

  在Matlab 下運行example2.exe: mex -f example2.c。運行結果如圖1 所示:

  

  利用計算引擎調用Matlab的特點是:節省大量的系統資源,應用程序整體性能較好,但 不能脫離Matlab的環境運行,且運行速度較慢,但在一些特別的應用(例如需要進行三維 圖形顯示)時可考慮使用。

  3.2 利用mcc 編譯器生成的cpp 和hpp 文件

  Matlab自帶的C++Complier--mcc,能將m文件轉換為C/C++代碼。因此,它為C/C++程序調用m文件提供了另一種便捷的方法。下面舉例說明相應步驟:

  a.新建example3.m:function y=exmaple3(n) y=0; for i=1:n y=y+i;end

  保存后在命令窗口中輸入:mcc -t -L Cpp -h example3.

  則在工作目錄下生成example3.cpp 和example3.hpp 兩個文件。

  b.在VC 中新建一個基于對話框的MFC 應用程序Test2,添加一個按鈕,并添加按鈕響應函數,函數內容見f 步。將上面生成的兩個文件拷貝到VC 工程的Test2 目錄下。

  c.在VC 中選擇:工程-》設置,選擇屬性表Link 選項,下拉菜單中選擇Input,在對象 / 庫模塊中加入libmmfile.lib libmatlb.lib libmx.lib libmat.lib libmatpm.lib sgl.lib libmwsglm.lib libmwservices.lib , 注意用空格分開; 而在忽略庫中加入 msvcrt.lib;

  d.選擇屬性表C/C++選項,下拉菜單選General,在預處理程序定義中保留原來有的內 容,并添加MSVC,IBMPC,MSWIND,并用逗號隔開。選擇下拉菜單的Precompiled Headers 選 項,在“自動使用預補償頁眉”中添加stdafx.h,然后確定。

  e. 選擇: 工具-》 選項, 屬性頁選擇“ 目錄” , 在include files 加入: C:\MATLAB6p5p1\extern\include , C:\MATLAB6p5p1\extern\include\cpp ; 然后在 Library files 里面加入: C:\MATLAB6p5p1\bin\win32 , C:\MATLAB6p5p1\extern\ lib\win32\microsoft\msvc60;注意根據用戶的Matlab 安裝位置,修改相應目錄。

  f.在響應函數中添加頭文件:#include “matlab.hpp” #include “example3.hpp” 函數響應代碼為:

  int i; mwArray n; n=10; n=example3(n); i=n.ExtractScalar(1);

  CString str; str.Format(“example3 的返回值是:%d”,i); AfxMessageBox(str);

  g. 編譯,連接,執行,結果如圖2 所示。

  

  3.3 利用mcc 編譯器生成的的DLL 文件

  Matlab的C++ Complier不僅能夠將Matlab的m文件轉換為C/C++的源代碼,還能產生完全 脫離Matlab運行環境的獨立可執行DLL程序。從而可以在C/C++程序中,通過調用DLL實現對 Matlab代碼的調用。下面通過一個簡單的例子說明C/C++調用m文件生成的DLL:

  a.建立m文件example4.m: function result=example4(para)

  x=[1 para 3]; y=[1 3 1]; plot(x,y); result=para*2; end.然后在命令窗口中輸入:

  mcc -t -W libhg:example4 -T link:lib -h libmmfile.mlib libmwsglm.mlib example4則在工作目錄下會生成example4 .dll、example4 .lib和example4 .h三個文件。

  b.在VC中新建一個基于對話框的應用程序Test3,然后添加一個按鈕及按鈕響應函數,函數內容見d步,再將生成的3個文件拷貝到Test2工程目錄下。

  c.VC編譯環境的設置如同3.2節c、d步;

  d.在按鈕函數文件添加如下的頭文件:#include “example4 .h” ,函數響應代碼為:

  mxArray* para=mxCreateDoubleScalar(2); mxArray* result; example4Initialize();

  result=mlfExample4(para); CString str;

  str.Format(“%f”,mxGetScalar(result)); AfxMessageBox(str);

  e.編譯,連接,執行,結果如圖3所示。

  

  利用mcc 編譯器生成的DLL 動態連接庫文件,只需在C/C++編譯環境中將其包含進來, 調用導出函數即可實現原m 文件的功能,極大地方便了用戶的代碼設計。

  4 結束語

  本文從Matlab 調用C/C++代碼和C/C+調用m 文件兩方面,詳細地研究了Matlab 與C/C++ 混合編程技術。對于Matlab 調用C/C++代碼,給出了常用的MEX 技術和調用C/C++動態連接 庫的方法,并對它們進行比較。針對用戶在實際中經常遇到的C/C++調用Matlab 問題,通過研究給出了常用的三種方法及其特點:利用Matlab 計算引擎的方法,混合編程后的可執 行程序脫離不了Matlab 的運行環境,運行速度很慢;利用mcc 編譯器將m 文件轉化為C/C++ 文件的方法,雖然能獨立于Matlab 運行環境,可在C/C++環境中包含生成的文件非常繁瑣; 但是m 文件生成的DLL 為用戶提供了一種簡潔方便的C/C++調用Matlab 代碼的方法。除 Matlab 自帶的mcc 外,Matcom 也能將M 文件編譯為C/C++文件和DLL 文件,但混合編程 原理一樣,在此省略。

此內容為AET網站原創,未經授權禁止轉載。
热re99久久精品国产66热_欧美小视频在线观看_日韩成人激情影院_庆余年2免费日韩剧观看大牛_91久久久久久国产精品_国产原创欧美精品_美女999久久久精品视频_欧美大成色www永久网站婷_国产色婷婷国产综合在线理论片a_国产精品电影在线观看_日韩精品视频在线观看网址_97在线观看免费_性欧美亚洲xxxx乳在线观看_久久精品美女视频网站_777国产偷窥盗摄精品视频_在线日韩第一页
  • <strike id="ygamy"></strike>
  • 
    
      • <del id="ygamy"></del>
        <tfoot id="ygamy"></tfoot>
          <strike id="ygamy"></strike>
          亚洲综合视频1区| 亚洲无玛一区| 久久亚洲高清| 欧美激情第1页| 欧美三级在线| 亚洲一区二区影院| 久久美女艺术照精彩视频福利播放| 亚洲精品久久久久久久久久久久久| 亚洲精品之草原avav久久| 国产一区视频在线观看免费| 午夜亚洲视频| 久久久久久亚洲精品杨幂换脸| 欧美在线影院| 久久综合综合久久综合| 欧美日韩中文在线观看| 亚洲青涩在线| 国产午夜久久| 亚洲天堂av高清| 欧美中文字幕在线播放| 欧美日本一区二区视频在线观看| 亚洲精品专区| 日韩视频一区二区三区| 国色天香一区二区| 欧美福利视频网站| 国产主播精品| 久久99伊人| 久久久国产91| 久久精品一区二区三区不卡| 欧美日韩三级视频| 欧美四级在线观看| 一区二区日韩伦理片| 欧美中文在线观看| 欧美日韩免费一区二区三区视频| 欧美高清自拍一区| 日韩一级免费观看| 美女视频黄a大片欧美| 亚洲欧美国产制服动漫| 国产精品视频99| 久久久久久一区二区三区| 国产精品嫩草99a| 亚洲视频在线视频| 亚洲精品久久久久久下一站| 国内精品国语自产拍在线观看| 夜夜嗨av色一区二区不卡| 欧美日韩在线视频首页| 欧美日韩亚洲一区二| 国产亚洲一区二区三区在线播放| 久久xxxx| 欧美影院精品一区| 亚洲第一在线视频| 精品999日本| 中国成人黄色视屏| 欧美精品国产精品| 国产精品美女久久久久av超清| 欧美高清在线精品一区| 亚洲欧美日韩综合| 亚洲国产精品va在线看黑人| 亚洲欧美国产毛片在线| 欧美亚州韩日在线看免费版国语版| 亚洲人成久久| 午夜欧美大片免费观看| 在线播放中文字幕一区| 欧美不卡三区| 久久人人爽爽爽人久久久| 国产欧美精品国产国产专区| 开心色5月久久精品| 影音先锋亚洲精品| 欧美成人午夜激情在线| 正在播放亚洲一区| 欧美巨乳波霸| 亚洲愉拍自拍另类高清精品| 亚洲黄一区二区| 99视频有精品| 久久一区二区三区超碰国产精品| aa日韩免费精品视频一| 欧美全黄视频| 国产精品国产三级国产aⅴ9色| 欧美日韩一区综合| 欧美日韩午夜激情| 亚洲一区www| 久久成人免费日本黄色| 亚洲欧美中文日韩在线| 久热成人在线视频| 亚洲欧美卡通另类91av| 国产一区二区精品在线观看| 亚洲欧美日韩另类精品一区二区三区| 一区二区三区毛片| 久久久久久亚洲精品杨幂换脸| 男女av一区三区二区色多| 欧美精品在线一区| 亚洲国产小视频在线观看| 欧美日韩在线不卡一区| 久久久久国色av免费观看性色| 国产精品国产福利国产秒拍| 欧美福利一区二区三区| 亚洲精品一区在线观看香蕉| 欧美一区91| 欧美大片国产精品| 国产精品综合| 欧美成人中文字幕在线| 欧美激情免费在线| 久久国产天堂福利天堂| 国产在线麻豆精品观看| 久久久91精品| 欧美日韩在线免费观看| 欧美金8天国| 国产精品亚洲美女av网站| 国产精品v欧美精品v日本精品动漫| 国产一区二区三区四区五区美女| 伊人久久大香线蕉av超碰演员| 亚洲一区二区成人在线观看| 欧美黄色日本| 久久国产日韩| 麻豆精品一区二区av白丝在线| 亚洲黄色在线| 欧美精品在线一区二区| 欧美在线电影| 国产婷婷色一区二区三区在线| 国产精品一区二区三区免费观看| 欧美一级在线播放| 欧美日本一区| 亚洲理论在线| 一区二区三区高清不卡| 久久精品国产99精品国产亚洲性色| 夜夜嗨av一区二区三区中文字幕| 亚洲一区图片| 国产婷婷色一区二区三区在线| 性做久久久久久久免费看| 亚洲高清久久久| 国产精品美女一区二区| 国产三区精品| 91久久香蕉国产日韩欧美9色| 亚洲午夜影视影院在线观看| 久久久精品午夜少妇| 99视频精品全国免费| 欧美a级片网站| 99精品国产福利在线观看免费| 亚洲国产精品视频一区| 美国成人毛片| 亚洲大片精品永久免费| 国产综合色精品一区二区三区| 久久精品综合一区| 国产精品久久久一本精品| 久久综合久久综合久久综合| 理论片一区二区在线| 香蕉久久一区二区不卡无毒影院| 欧美日韩精品一区二区三区| 亚洲日本在线视频观看| 欧美天堂亚洲电影院在线播放| 亚洲精品欧美日韩专区| 国产精品自拍小视频| 久久久91精品国产| 夜夜躁日日躁狠狠久久88av| 欧美在线欧美在线| 欧美一区二区女人| 亚洲欧美日本国产有色| 久久永久免费| 久久这里有精品15一区二区三区| 正在播放欧美视频| 亚洲美女少妇无套啪啪呻吟| 欧美与黑人午夜性猛交久久久| 欧美成人国产va精品日本一级| 国产在线拍揄自揄视频不卡99| 国产一区二区三区久久久久久久久| 久久综合色天天久久综合图片| 国产综合视频在线观看| 日韩一区二区精品视频| 亚洲卡通欧美制服中文| 欧美人成免费网站| 欧美激情一区二区| 亚洲国产人成综合网站| 欧美日韩国产精品专区| 亚洲高清精品中出| 久久免费国产精品| 欧美三日本三级三级在线播放| 国产精品国产成人国产三级| 亚洲第一精品福利| 亚洲国产日韩欧美综合久久| 久久久久国产精品一区| 欧美日韩午夜| 国产日韩综合一区二区性色av| 欧美精品一区二区三区蜜臀| 欧美国产在线观看| 国产欧美日本一区视频| 国产欧美精品在线| 亚洲午夜精品在线| 日韩香蕉视频| 精品999在线播放| 国产精品porn| 国内揄拍国内精品久久| 欧美国产免费| 国产精品久久久久av| 国产精品v片在线观看不卡| 亚洲国产精品久久久久婷婷884| 欧美一级片久久久久久久| 免费在线日韩av| 亚洲视屏一区| 国产精品va在线播放| 欧美大片国产精品| 国产欧美1区2区3区| 亚洲福利视频免费观看| 久久亚洲影音av资源网| 亚洲免费观看高清完整版在线观看| 99国产精品国产精品毛片| 欧美日韩在线三区| 欧美午夜精品一区二区三区| 欧美超级免费视 在线| 经典三级久久| 亚洲男人影院| 欧美激情精品久久久久久大尺度| 女仆av观看一区| 亚洲一区影音先锋| 亚洲精品午夜| 亚洲伊人网站| 国产精品国产三级国产| 欧美日韩美女| 午夜视频在线观看一区二区三区| 久久精品中文字幕一区二区三区| 亚洲精品国产拍免费91在线| 国产精品久久久久秋霞鲁丝| 久久亚洲影院| 99视频日韩| 亚洲午夜在线观看视频在线| 国模精品娜娜一二三区| 欧美日韩亚洲激情| 1769国内精品视频在线播放| 午夜日韩在线| 国产精品日本一区二区| 欧美性一区二区| 欧美日韩国产色视频| 久久九九热re6这里有精品| 亚洲视频在线观看一区| 欧美久久久久久久久| 国产精品99久久久久久www| 亚洲伦理一区| 亚洲国产精品久久精品怡红院| 久久av免费一区| 国精产品99永久一区一区| 亚洲精品美女在线| 激情欧美日韩| 久久这里有精品视频| 香蕉成人伊视频在线观看| 亚洲人体大胆视频| 欧美久久久久久| 欧美日韩精品在线观看| 久久男人av资源网站| 欧美制服丝袜| 久久香蕉国产线看观看网| 国产综合香蕉五月婷在线| 亚洲丶国产丶欧美一区二区三区| 亚洲国语精品自产拍在线观看| 欧美日韩国产页| 亚洲欧美国产日韩天堂区| 午夜精品一区二区三区在线视| 国产日韩欧美在线看| 国产精品都在这里| 欧美三级电影一区| 宅男精品视频| 久久亚洲私人国产精品va| 亚洲三级观看| 欧美一级理论性理论a| 国产精品日韩在线观看| 女仆av观看一区| 国内外成人免费激情在线视频| 亚洲无玛一区| 篠田优中文在线播放第一区| 欧美精品首页| 日韩亚洲欧美高清| 亚洲国产裸拍裸体视频在线观看乱了| 黑人一区二区三区四区五区| 久久成年人视频| 91久久精品国产91久久性色tv| 亚洲一区二区三区免费观看| 亚洲欧洲在线观看| 国产一区二区成人| 欧美日韩精品一区二区天天拍小说| 欧美一区二区三区婷婷月色| 欧美性片在线观看| 国产亚洲精品bv在线观看| 日韩视频在线免费| 欧美麻豆久久久久久中文| 久久亚洲二区| 欧美日本高清一区| 在线日韩精品视频| 久久aⅴ国产欧美74aaa| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久影院色老大| 欧美二区在线| 国产色婷婷国产综合在线理论片a| 亚洲国产另类精品专区| 激情综合中文娱乐网| 久久成人久久爱| 久久综合中文色婷婷| 亚洲级视频在线观看免费1级| 国产日韩欧美一区在线| 欧美 日韩 国产精品免费观看| 国产欧美日韩亚洲精品| 欧美一区视频| 亚洲国产精品毛片| 亚洲中字在线| 午夜精品久久久久| 亚洲欧美乱综合| 夜夜嗨av色综合久久久综合网| 禁久久精品乱码| 一区二区三区成人| 欧美午夜视频| 亚洲天天影视| 久热综合在线亚洲精品| 中文精品一区二区三区| 国产视频一区在线观看一区免费| 亚洲精品视频中文字幕| 欧美偷拍一区二区| 欧美淫片网站| 今天的高清视频免费播放成人| 亚洲第一区在线观看| 久久精品国产免费看久久精品| 欧美日韩成人综合天天影院| 亚洲欧美日韩在线观看a三区| 娇妻被交换粗又大又硬视频欧美| 黑人一区二区| 国产精品久久久久国产精品日日| 亚洲午夜激情| 久久久人人人| 在线观看成人小视频| 久久精品水蜜桃av综合天堂| 一本色道久久88精品综合| 国内揄拍国内精品少妇国语| 久久精品国产免费观看|