用C语言编写MEX文件
1.1 为什么要用C语言编写MEX文件
MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用for循环时,把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。
1.2 编译器的安装与配置
要使用MATLAB编译器,用户计算机上应用事先安装与MATLAB适配的以下任何一种ANSI C/C++编译器:
5.0、6.0版的MicroSoft Visual C++(MSVC) 5.0、5.2、5.3、5.4、5.5版的Borland C++ LCC(由MATLAB自带,只能用来产生MEX文件)
下面是安装与配置MATLAB编译器应用程序MEX的设置的步骤: (1)在MATLAB命令窗口中运行mex –setup,出现下列提示:
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n?
(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:
Select a compiler:
[1] Borland C++Builder version 6.0 in C:\\Program Files\\Borland [2] Digital Visual Fortran version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[3] Lcc C version 2.4 in D:\\MATLAB6P5P1\\sys\\lcc
[4] Microsoft Visual C/C++ version 6.0 in C:\\Program Files\\Microsoft Visual Studio
[0] None Compiler:
(3)选择其中一种(在这里选择了3),MATLAB让用户进行确认: Please verify your choices: Compiler: Lcc C 2.4
Location: D:\\MATLAB6P5P1\\sys\\lcc Are these correct?([y]/n):
(4)选择y,结束MATLAB编译器的配置。 1.3 一个简单的MEX文件例子
【例1】用m文件建立一个1000×1000的Hilbert矩阵。
tic m=1000; n=1000;
a=zeros(m,n); for i=1:1000 for j=1:1000 a(i,j)=1/(i+j); end end toc
elapsed_time = 0.1100
在记事本中输入以下程序: [Matlab_1.cpp] #include \//计算过程
void hilb(double *y,int n) {
int i,j; for(i=0;i *(y+j+i*n)=1/((double)i+(double)j+1); } //接口过程 void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]) { double x,*y; int n; if (nrhs!=1) mexErrMsgTxt(\ if (nlhs != 1) mexErrMsgTxt(\ if (!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1) mexErrMsgTxt(\ x=mxGetScalar(prhs[0]); plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL); n=mxGetM(plhs[0]); y=mxGetPr(plhs[0]); hilb(y,n); } 该程序是一个C语言程序,它也实现了建立Hilbert矩阵的功能。在MATLAB命令窗口输入以下命令:mex Matlab_1.cpp,即可编译成功。进入该文件夹,会发现多了两个文件:Matlab_1.asv和Matlab_1.dll,其中Matlab_1.dll即是MEX文件。运行下面程序: tic a=Matlab_1(1000); toc elapsed_time = 0.0470 由上面看出,同样功能的MEX文件比m文件快得多。 1.4 MEX文件的组成与参数 MEX文件的源代码一般由两部分组成: (1)计算过程。该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。 (2)入口过程。该过程提供计算过程与MATLAB之间的接口,以入口函数mxFunction实现。在该过程中,通常所做的工作是检测输入、输出参数个数和类型的正确性,然后利用mx-函数得到MATLAB传递过来的变量(比如矩阵的维数、向量的地址等),传递给计算过程。 MEX文件的计算过程和入口过程也可以合并在一起。但不管那种情况,都要包含#include \,以保证入口点和接口过程的正确声明。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即: