Matlab与C语言措施应用编程接口
副标题#e#
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返回计较功效的进程。
#p#副标题#e#
二、 利用MEX文件
上面所述的MEX文件的两个主要部门在利用中可以是独立的,也可以是组合在一起的。不管是哪一种环境,MEX文件都必需包括头文件"mex.h",以便正常申明进口措施。进口措施的名字必需是mexFunction并且必需包括这些参数:
void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
在C语言的MEX文件中,参数nlhs和nrhs包括输出和输入变量的数目,借助于这两个参数,MEX文件被挪用。参数plhs和prhs是包括指向MEX文件输出和输入变量的指针的向量,prhs是长度为nrhs的输入变量的指针数组,plhs是长度为nlhs的输出变量的指针数组。好比从MATLAB呼吁窗口来挪用一个MEX文件:
x=fun(y,z);
则MATLAB编译器利用下面的变量来挪用mexFunction:
nlhs=1
nrhs=2
plhs=(pointer)->/*unassigned*/
prhs=(pointer)->y
(pointer)->z
plhs指向只有一个元素的C语言数组,而且这个元素为空指针。prhs指向含有两个元素的C语言数组,个中第一个元素指向mxArray型变量Y,第二个元素指向mxArray型变量Z。
这里,plhs指向空的数组是由于输出x在子措施执行前尚未发生,进口措施的浸染就是建设输出数组并分派指针plhs[0]指向该数组。假如plhs[0]没有赋值,MATLAB将给出输出变量没有赋值的告诫信息。
三、C语言措施MEX文件实例
MATLAB 5 API提供了一系列措施来处理惩罚MATLAB所支持的各类数据范例,每一种数据范例都有对应函数共你利用来处理惩罚对应的数据。下面给出一个简朴的C语言措施和与之对应的MEX文件代码,该措施的成果是将标量x更加。
C语言措施如下:
#include "math.h"
void timestwo(double y[], double x[])
{
y[0]=2.0*x[0];
return;
}
下面是与C语言措施成果沟通的MEX文件:
#include "mex.h"
void timestwo(double y[], double x[])
{
y[0]=2.0*x[0];
}
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
double *x, *y;
int mrows, ncols;
/*查抄正确的参数数目*/
if(nrhs!=1){
mexErrMsgTxt("需要一个输入参数.");
}
else if(nlhs>1){
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);
}
#p#分页标题#e#
C语言是在编译的时候查抄函数参数。MATLAB可以在M函数中通报任意数量和范例的参数,MEX文件也是如此,不外在措施中必需靠得住地处理惩罚输入输出参数的数目。假如将上面的MEX文件定名为timestwo.c,就可以对它举办编译和链接,在MATLAB呼吁窗口下输入:
mex timestwo.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中和其他措施成立客户/处事器干系等成果。