歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Matlab與C/C++聯合編程之從Matlab調用C/C++代碼

利用Matlab與VC++聯合編程,既可在C語言程序中打開Matlab引擎,調用Matlab的ToolBox函數和作圖函數,也可在Matlab中調用C代碼生成的動態鏈接庫文件,用以加快執行速度、縮短開發周期,取得更好的效果。MATLAB與C語言的接口采用稱為MEX的動態鏈接方式進行。MEX文件是由C源程序經過編譯生成的MATLAB動態鏈接子程序,它的作用十分類似於MATLAB的內建函數,可由MATLAB方便地調用。本文主要講解從Matlab中調用C/C++代碼的相關知識。

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

利用MEX技術,從MATLAB調用C/C++代碼

1)使用者應該在系統中安裝MATLAB支持的C/C++編譯器。在Matlab與C/C++混合編程之前,必須先對Matlab的編譯應用程序mex和編譯器mbuild進行正確的設置:

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

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

2)MEX文件的源文件實際上就是一個C語言源文件, MEX的源文件結構由兩部分組成:入口子程序和功能子程序。

入口子程序起鏈接C子程序與MATLAB系統的作用,是實現MATLAB與C混合編程所必須的。格式為:

  1. #include “mex.h”   
  2.   
  3. void mexFunction( int nlhs, mxArray *plhs[],  
  4.   
  5.                    int nrhs, const mxArray *prhs[] )  
  6. {  
  7.   
  8.               //C語言代碼   
  9.   
  10. }  

其中入口子程序函數名必須為mexFunction。其中nlhs (number of left-hand side) 是輸出參數的個數,nrhs(number of right-hand side) 是輸入參數的個數。prhs[]與plhs[]是指針數組變量,其元素為指向右變量與左變量的指針。在用戶程序中可利用上述指針在C與MATLAB中相互傳遞數據。MEX函數庫裡的mexFunction()函數,相當於C語言中的main()函數。MEX源文件沒有main(),而是以一個mexFunction()代替。

功能子程序用於完成一些特定的計算功能或硬件處理功能,由上述的入口子程序調用。如果必要,該程序可與入口子程序合二為一。

3)MEX源文件的編譯

設上述兩部分形成的源文件存為MyMEXFun.c。則可在MATLAB環境下使用mex MyMEXFun.c命令進行編譯

4)MEX文件的調用格式

[a,b,c...]=MyMEXFun(x,y,z...)

其中,x,y,z...表示函數的輸入變量;a,b,c...表示函數的輸出變量。

5)MEX文件的調試

下面由一個簡單的例子來講解下MEX文件的調試。

在Matlab當前目錄下新建一文件MyMEXFun.c,文件內容為: 

  1. #include "mex.h"   
  2.   
  3. double add(double x, double y)  
  4. {  
  5.     return x+y;  
  6. }  
  7. void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])  
  8. {  
  9.     double a,b,*c;  
  10.   
  11.     a=mxGetScalar(prhs[0]);  
  12.     b=mxGetScalar(prhs[1]);  
  13.   
  14.     plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);  
  15.           
  16.     c=mxGetPr(plhs[0]);  
  17.   
  18.     *c=add(a,b);  
  19. }  

首先對文件內容進行簡單說明:

其中nlhs (number of left-handside) 是輸出參數的個數,nrhs (number of right-hand side) 是輸入參數的個數。例如對於c=add(a,b),有nlhs=1,hrhs=2。

Copyright © Linux教程網 All Rights Reserved