C语言与matlab接口MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。而C语言功能丰富,使用灵活方便,目标程序效率高。既有高级语言的优点,又有低级语言的特点。因此,C语言是目前应用最广的编程语言。虽然MATLAB是一个完整的、功能齐全的编程环境,但在某些情况下,与外部环境的数据和程序的交互是非常必须而且有益的。众所周知,MATLAB是用M语言编程,不能在M文件中直接调用C语言程序。可以通过MATLAB提供的应用编程接口(API)来实现与外部的接口,在MATLAB环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。MATLAB中调用C语言程序,必须通过MEX文件来实现。一、C语言的MEX文件的结构C语言的MEX文件是一种动态连接子程序,可以象调用M文件一样调用它。MEX文件主要有以下几方面的应用:(1)在MATLAB中,M文件的计算速度特别是循环迭代的速度远比C语言慢,因此可以把要求大量循环迭代的部分用C语言编写为MEX文件,提高计算速度。(2)已经开发的C语言程序,则不必将其转化为M文件而重复劳动,通过添加入口程序mexFunction,可以由MATLAB调用。(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。C语言的MEX文件的源程序由两个非常明显部分组成:(1)计算程序,即在MEX文件中完成计算功能的程序代码,计算程序可以是普通的C语言程序,按照C语言规则编写即可(2)入口程序,将计算程序与MATLAB连接的入口函数mexFunction。入口程序mexFunction相对要复杂一些,函数中有四个参数nlhs、plhs、nrhs和prhs。这里nlhs是输出数据的个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)的输出数据的指针,nrhs是输入数据的个数,prhs是指向mxArray的输入数据的指针。图1显示了如何向MEX文件输入数据,通过接口函数调用计算程序完成运算过程,最后向MATLAB返回计算结果的过程。二、使用MEX文件上面所述的MEX文件的两个主要部分在使用中可以是独立的,也可以是组合在一起的。不管是哪一种情况,MEX文件都必须包含头文件mex.h,以便正常申明入口程序。入口程序的名字必须是mexFunction而且必须包含这些参数:voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[])在C语言的MEX文件中,参数nlhs和nrhs包含输出和输入变量的数目,借助于这两个参数,MEX文件被调用。参数plhs和prhs是包含指向MEX文件输出和输入变量的指针的向量,prhs是长度为nrhs的输入变量的指针数组,plhs是长度为nlhs的输出变量的指针数组。比如从MATLAB命令窗口来调用一个MEX文件:x=fun(y,z);则MATLAB编译器使用下面的变量来调用mexFunction:nlhs=1nrhs=2plhs=(pointer)-/*unassigned*/prhs=(pointer)-y(pointer)-zplhs指向只有一个元素的C语言数组,并且这个元素为空指针。prhs指向含有两个元素的C语言数组,其中第一个元素指向mxArray型变量Y,第二个元素指向mxArray型变量Z。这里,plhs指向空的数组是由于输出x在子程序执行前尚未产生,入口程序的作用就是创建输出数组并分配指针plhs[0]指向该数组。如果plhs[0]没有赋值,MATLAB将给出输出变量没有赋值的警告信息三、C语言程序MEX文件实例MATLAB5API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。C语言程序如下:#includemath.hvoidtimestwo(doubley[],doublex[]){y[0]=2.0*x[0];return;}下面是与C语言程序功能相同的MEX文件:#includemex.hvoidtimestwo(doubley[],doublex[]){y[0]=2.0*x[0];}voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){double*x,*y;intmrows,ncols;/*检查正确的参数数目*/if(nrhs!=1){mexErrMsgTxt(需要一个输入参数.);}elseif(nlhs1){mexErrMsgTxt(输出参数太多.);}/*输入变量必须是非复数类型的标量*/mrows=mxGetM(prhs[0]);ncols=mxGetN(prhs[0]);if(!mxIsDouble(prhs[0])mxIsComplex(prhs[0])!(mrows==1&&ncols==1)){mexErrMsgTxt(输入变量必须是非复数类型的标量.);}/*为返回参数创建矩阵*/plhs[0]=mxCreateDoubleMatrix(mrows,ncols,mxREAL);/*分配输入输出参数的指针*/x=mxGetPr(prhs[0]);y=mxGetPr(plhs[0]);/*调用timestwo子函数*/timestwo(y,x);}C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:mextimestwo.c这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。在MATLAB命令窗口中输入:x=2;y=timestwo(x);就可以得到:y=4;四、小结MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能