歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Matlab與C/C++聯合編程之從Matlab調用C/C++代碼

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

日期:2017/3/1 10:12:52   编辑:Linux編程

利用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. void mexFunction( int nlhs, mxArray *plhs[],
  3. int nrhs, const mxArray *prhs[] )
  4. {
  5. //C語言代碼
  6. }

其中入口子程序函數名必須為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. double add(double x, double y)
  3. {
  4. return x+y;
  5. }
  6. void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[])
  7. {
  8. double a,b,*c;
  9. a=mxGetScalar(prhs[0]);
  10. b=mxGetScalar(prhs[1]);
  11. plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
  12. c=mxGetPr(plhs[0]);
  13. *c=add(a,b);
  14. }

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

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

Copyright © Linux教程網 All Rights Reserved