mex文件_实现调用c函数的接口

mex文件_实现调用c函数的接口

ID:9233493

大小:182.51 KB

页数:32页

时间:2018-04-24

mex文件_实现调用c函数的接口_第1页
mex文件_实现调用c函数的接口_第2页
mex文件_实现调用c函数的接口_第3页
mex文件_实现调用c函数的接口_第4页
mex文件_实现调用c函数的接口_第5页
资源描述:

《mex文件_实现调用c函数的接口》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、MEX文件--实现调用C函数的接口如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:doubleadd(doublex,doubley){returnx+y;}现在我想要在Matlab中使用它,比如输入:>>a=add(1.1,2.2)3.3000要得出以上的结果,那应该怎样做呢?解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入

2、了C函数,得出的结果再通过该接口调回Matlab。1该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。所以现在我们要写一个包含add和mexFunction的C文件,Matlab调用函数,把函数中的自变量(如上例中的1.1和2.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。值得注意的是,mex文件是与平台有关的,以我的理解,mex文件就是另类的动态链接库。

3、在matlab6.5中使用mex-v选项,你可以看到最后mex阶段有类似如下的信息:-->"del_lib94902.obj"-->"del"test.exp""-->"del"test.lib""也就是说,虽然在matlab6.5生成的是dll文件,但是中间确实有过lib文件生成。比如该C文件已写好,名为add.c。那么在Matlab中,输入:2>>mexadd.c就能把add.c编译为MEX文件(编译器的设置使用指令mex-setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用

4、M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。我们现在来说mexFunction怎样写。mexFunction的定义为:voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){/*....................................*/}3可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Ma

5、tlab调用MEX文件时的具体信息,如这样调用函数时:>>b=1.1;c=2.2;>>a=add(b,c)mexFunction四个参数的意思为:nlhs=1,说明调用语句左手面(lhs-lefthandside)有一个变量,即a。nrhs=2,说明调用语句右手面(rhs-righthandside)有两个自变量,即b和c。plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[

6、0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数4组,即不能改变其指向内容。因为Matlab最基本的单元为array,无论是什么类型也好,如有doublearray、cellarray、structarray……所以a,b,c都是array,b=1.1便是一个1x1的doublearray。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。完整的add.c如下:#include"mex.h"//使用MEX文件必须包含的头文件//执行具体

7、工作的C函数doubleadd(doublex,doubley){returnx+y;}5//MEX文件接口函数voidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){double*a;doubleb,c;plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);a=mxGetPr(plhs[0]);b=*(mxGetPr(prhs[0]));c=*(mxGetPr(prhs[1]));*a=add(b,c);}mexFunction的内容是什么意思

8、呢?我们知道,如果这样调用函数时:>>output=add(1.1,2.2);6在未涉及具体的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。