eastnapole 发表于 2006-6-6 01:07

Matlab与C语言程序的应用编程接口

<P>MATLAB作为世界顶尖的数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析和动态仿真等功能,在航空航天、机械制造和工程建筑等领域发挥着越来越重要的作用。而C语言功能丰富,使用灵活方便,目标程序效率高。既有高级语言的优点,又有低级语言的特点。因此,C语言是目前应用最广的编程语言。虽然MATLAB是一个完整的、功能齐全的编程环境,但在某些情况下,与外部环境的数据和程序的交互是非常必须而且有益的。</P>
<P>众所周知,MATLAB是用M语言编程,不能在M文件中直接调用C语言程序。可以通过MATLAB提供的应用编程接口(API)来实现与外部的接口,在MATLAB环境中实现调用C语言或Fortran程序、输入或输出数据以及和其他软件程序间建立客户/服务器关系等功能。</P>
<P>MATLAB中调用C语言程序,必须通过MEX文件来实现。</P>
<P>一、 C语言的MEX文件的结构</P>
<P>C语言的MEX文件是一种动态连接子程序,可以象调用M文件一样调用它。MEX文件主要有以下几方面的应用:</P>
<P>(1)在MATLAB中,M文件的计算速度特别是循环迭代的速度远比C语言慢,因此可以把要求大量循环迭代的部分用C语言编写为MEX文件,提高计算速度。<BR>(2)已经开发的C语言程序,则不必将其转化为M文件而重复劳动,通过添加入口程序mexFunction,可以由MATLAB调用。<BR>(3)直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。 </P>
<P>C语言的MEX文件的源程序由两个非常明显部分组成:<BR>(1)计算程序,即在MEX文件中完成计算功能的程序代码,计算程序可以是普通的C语言程序,按照C语言规则编写即可<BR>(2)入口程序,将计算程序与MATLAB连接的入口函数mexFunction。入口程序mexFunction相对要复杂一些,函数中有四个参数nlhs、plhs、nrhs和prhs。这里nlhs是输出数据的个数,plhs是指向mxArray(MATLAB中所有数据都由mxArray定义)的输出数据的指针,nrhs是输入数据的个数,prhs是指向mxArray的输入数据的指针。</P>
<P><BR>二、 使用MEX文件</P>
<P>上面所述的MEX文件的两个主要部分在使用中可以是独立的,也可以是组合在一起的。不管是哪一种情况,MEX文件都必须包含头文件"mex.h",以便正常申明入口程序。入口程序的名字必须是mexFunction而且必须包含这些参数:</P>
<P>void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])</P>
<P>在C语言的MEX文件中,参数nlhs和nrhs包含输出和输入变量的数目,借助于这两个参数,MEX文件被调用。参数plhs和prhs是包含指向MEX文件输出和输入变量的指针的向量,prhs是长度为nrhs的输入变量的指针数组,plhs是长度为nlhs的输出变量的指针数组。比如从MATLAB命令窗口来调用一个MEX文件:<BR>x=fun(y,z);</P>
<P>则MATLAB编译器使用下面的变量来调用mexFunction:<BR>nlhs=1<BR>nrhs=2<BR>plhs=(pointer)-&gt;/*unassigned*/<BR>prhs=(pointer)-&gt;y<BR>(pointer)-&gt;z</P>
<P>plhs指向只有一个元素的C语言数组,并且这个元素为空指针。prhs指向含有两个元素的C语言数组,其中第一个元素指向mxArray型变量Y,第二个元素指向mxArray型变量Z。</P>
<P>这里,plhs指向空的数组是由于输出x在子程序执行前尚未产生,入口程序的作用就是创建输出数组并分配指针plhs指向该数组。如果plhs没有赋值,MATLAB将给出输出变量没有赋值的警告信息。 </P>
<P>三、C语言程序MEX文件实例</P>
<P>MATLAB 5 API提供了一系列程序来处理MATLAB所支持的各种数据类型,每一种数据类型都有对应函数共你使用来处理对应的数据。下面给出一个简单的C语言程序和与之对应的MEX文件代码,该程序的功能是将标量x加倍。</P>
<P>C语言程序如下:</P>

<P><BR>#include "math.h"<BR>void timestwo(double y[], double x[])<BR>{<BR>y=2.0*x;<BR>return;<BR>}</P>
<P>下面是与C语言程序功能相同的MEX文件:<BR>#include "mex.h"<BR>void timestwo(double y[], double x[])<BR>{<BR>y=2.0*x;<BR>}<BR>void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])<BR>{<BR>double *x, *y;<BR>int mrows, ncols;<BR>/*检查正确的参数数目*/<BR>if(nrhs!=1){<BR>mexErrMsgTxt("需要一个输入参数.");<BR>}<BR>else if(nlhs&gt;1){<BR>mexErrMsgTxt("输出参数太多.");<BR>}<BR>/*输入变量必须是非复数类型的标量*/<BR>mrows=mxGetM(prhs);<BR>ncols=mxGetN(prhs);<BR>if(!mxIsDouble(prhs) || mxIsComplex(prhs) || !(mrows==1 &amp;&amp; ncols==1)){<BR>mexErrMsgTxt("输入变量必须是非复数类型的标量.");<BR>}<BR>/*为返回参数创建矩阵*/<BR>plhs=mxCreateDoubleMatrix(mrows, ncols, mxREAL);<BR>/*分配输入输出参数的指针*/<BR>x=mxGetPr(prhs);<BR>y=mxGetPr(plhs);<BR>/*调用timestwo子函数*/<BR>timestwo(y, x);<BR>}</P>

<P><BR>C语言是在编译的时候检查函数参数。MATLAB可以在M函数中传递任意数量和类型的参数,MEX文件也是如此,不过在程序中必须可靠地处理输入输出参数的数目。如果将上面的MEX文件命名为timestwo.c,就可以对它进行编译和链接,在MATLAB命令窗口下输入:<BR>mex timestwo.c</P>
<P>这是产生MEX文件timestwo.***所必需的步骤,该文件的扩展名所运行的系统平台的类型。Windows系统下,扩展名为dll。此时,就可以象调用M函数一样调用timestwo了。<BR>在MATLAB命令窗口中输入:<BR>x=2;<BR>y=timestwo(x);<BR>就可以得到:<BR>y=4;</P>
<P>四、小 结</P>
<P>MEX文件虽然具有较强大的功能,但并不是对所有的应用都恰当。MATLAB是一个高效率的编程系统,特别适合于工程计算、系统仿真等应用。它的最大优点就是将人们从繁杂的程序中解放出来。因此,能够用M文件完成的程序,应尽量使用MATLAB编写,除非遇到必须使用MEX文件的情况。</P>
<P>MATLAB的应用编程接口是一个功能强大的系统,除了调用C或Fortran程序,还可以实现从MATLAB环境中输入输出数据、在MATLAB中和其他程序建立客户/服务器关系等功能。</P>
<P><BR> </P>

wnayy 发表于 2006-6-15 17:17

<P>搂主果然厉害!<BR>不知道搂主对C文件的S函数是不是也精通,我现在学的头都大了,简直要跳楼,很希望得到高人的指导,如果愿意的话联系我哦。QQ:497860102。</P>
<P></P>

钱多多 发表于 2006-12-11 19:24

minnieme 发表于 2006-12-12 10:07

不错,谢谢

shaya1243 发表于 2007-3-14 19:47

有用!!非常感谢!!
页: [1]
查看完整版本: Matlab与C语言程序的应用编程接口