《MATLAB外部接口编程-创建C语言MEX文件》由会员分享,可在线阅读,更多相关《MATLAB外部接口编程-创建C语言MEX文件(151页珍藏版)》请在金锄头文库上搜索。
1、第3章 创建C语言MEX文件 第3章 创建C语言MEX文件 3.1 MEX文件简介 3.2 MEX源文件的结构 3.3 创建MEX文件 3.4 MEX文件的内存管理 3.5 MEX文件示例 3.6 调试MEX文件 本章小结 练习 第3章 创建C语言MEX文件 3.1 MEX文件简介 MEX从字面上是MATLAB和Executable两个单词的缩写。一般地MEX文件使用C语言或者Fortran语言进行开发,通过适当的编译之后,生成的目标文件能够被M语言解释器调用执行。MEX文件在使用上和M函数文件非常类似,但是由于M语言解释器解析指令具有优先级特性,所以MEX文件总是被优先执行。 第3章 创建C
2、语言MEX文件 mex mexHelloWorld.c 第3章 创建C语言MEX文件 其中,“”表示敲回车键。这个命令行有两个部分,mex为编译器指令,mexHelloWorld.c就是用户创建的C文件。注意,在这里需要给出C文件的扩展名。如果编辑的应用程序没有任何错误,则MATLAB命令行中不会显示任何消息;否则,在MATLAB命令行中将显示相应的错误消息提示。一般常见的错误是拼写错误,例如没有区分大小写字母、语句结尾没有分号“;”等。如果出现编译错误,请仔细查看键入的源程序代码,修改错误直到编译通过为止。 第3章 创建C语言MEX文件 编译的结果是创建出MATLAB的MEX文件,可以在MA
3、TLAB命 令行下键入what指令查看当前路径下是否具有MEX文件。 whatMEX-files in the current directory D:TempmexHelloWorld 接着,运行创建的MEX文件,在MATLAB命令行中键入下面 的指令: mexHelloWorldHello MATALB World! 第3章 创建C语言MEX文件 例3-1的MEX文件的功能就是在MATLAB命令行下输出一条文本信息。还可以在MATLAB命令行窗口中键入下面的指令: which mexHelloWorldD:TempmexHelloWorld.dllwhich指令可以查看当前执行的指令或者函
4、数具体的位置或者类型。可以发现,在Windows平台下MEX文件的扩展名称为.dll。不同操作系统平台下的MEX文件扩展名称不尽相同,读者可以在自己的平台下,在MATLAB命令行中使用mexext指令获取当前平台下MEX文件的扩展名,在表3-1中总结了这些文件的扩展名类型。 第3章 创建C语言MEX文件 表3-1 MEX文件的扩展名 第3章 创建C语言MEX文件 上述编译MEX文件的过程同样可以在操作系统的控制台下完成,例如在Windows平台下,在命令行提示符窗口中,直接键入mex mexFilename.c也可以完成MEX文件的编译。注意,mexFilename.c文件一定在当前的路径下。
5、在命令行提示符窗口中同样可以完成系统编译器的配置。提示:控制台方式控制台方式这个名词应该是来自于UNIX/Linux操作系统。而在Windows 9x操作系统中,为了照顾大多数从MS-DOS操作系统过渡到Windows操作系统的用户,Windows提供了一个可以运行在Windows图形界面中的字符界面 MS-DOS窗口,叫作MS-DOS方式。在Windows 2000系统中叫作命令提示符。 第3章 创建C语言MEX文件 3.2 MEX源文件的结构 3.2.1 源文件的基本结构C语言MEX源文件是标准的C语言源文件,其程序的基本语法完完全全是ANSI C的语法结构。所以,请读者注意,某些C/C+
6、编译器不仅仅支持标准C语言的语法,可能还支持一些特殊的C语法结构,例如Microsoft Visual C/C+ 6.0的编译器支持以“/”的形式添加程序注释,这些特殊的程序特性最好不要出现在C语言MEX源文件中,以免影响了程序的可移植特性。 第3章 创建C语言MEX文件 在例3-1中程序的第002行包含了一个头文件mex.h,在所有C语言的MEX源文件中必须包含该头文件,该头文件位于%MATLABROOT%externinclude路径下。在这个头文件中完成了所有C语言MEX函数的原型声明,同时还包含了matrix.h文件。matrix.h文件包含了第2章介绍的若干mx函数和数据类型的声明和
7、定义,所以在编写C语言MEX源文件的时候,就不必在C文件中再次包含matrix.h文件了。 第3章 创建C语言MEX文件 例3-1的源文件第004行和005行为C语言MEX源文件的入口函数部分。这两行代码是所有C语言MEX源文件必须包含的内容,而且书写的内容也必须按照固定的格式,也就是说必须按照例子中的书写方法来表示这两行代码:void mexFunction(int nlhs, mxArray *plhs,int nrhs, const mxArray *prhs) 第3章 创建C语言MEX文件 mexFunction函数的作用类似C语言源文件的main函数, 它是MEX文件的入口函数。当在
8、MATLAB命令行中执行MEX函数 时,MATLAB解释器将从此函数开始执行MEX代码。该入口函数的输入参数有四个,其意义分别是:nlhs:表示输入参数的个数。Plhs:mxArray类型的指针数组,表示MEX函数的输入参 数。Nrhs:表示输出参数的个数。Prhs:mxArray类型的指针数组,表示MEX函数的输出参 数。 第3章 创建C语言MEX文件 其实上述输入、输出参数的名称非常容易记忆,lhs代表Left hand parameters,rhs代表right hand parameters,n代表number,p代表pointer。这里的左手和右手如何划分呢?例如在MATLAB中调用
9、求伯特图的函数时,可以这样表示:mag,phase,w = bode(sys)这里以“=”为分界,左边的参数mag、phase和w为输出参数,即左手参数,而等号右边的参数sys为输入参数,即右手参数。 第3章 创建C语言MEX文件 3.2.2 MEX文件的参数在MEX应用程序中判断用户的输入参数和输出参数是否满足要求是非常重要的一个操作,参见下面的例子。 mex simple.c simple? 必须给一个输入参数!Error in = D:Tempsimple.dll a b = simple? 必须给一个输入参数!Error in = D:Tempsimple.dll a = simple
10、This is a simple MEX-File a =1 3 52 4 6 第3章 创建C语言MEX文件 在执行simple.c程序时,命令行中必须给定合适的输出参数,否则根据程序中的判断将给出错误的信息,该信息是通过mexErrMsgTxt函数给出的,该函数的详细解释可以参阅MATLAB的帮助文档,在3.5小节中,还会再次使用该函数来控制程序的错误。请读者留意程序的021024行,在MEX函数源文件中,必须对输出参数占用的内存空间进行合理的分配,否则会造成内存泄漏等异常错误。所谓合理的分配就是设置符合要求 的数据类型和数组元素个数。那么mexFunction入口函数的参数和MATLAB函
11、数的输入、输出参数之间究竟是怎样对应的呢?查看下面的C语言MEX文件代码片段: 第3章 创建C语言MEX文件 /* MEX - File myfun.c */# include “mex.h“void mexFunction( int nlhs, mxArray *plhs,int nrhs, const mxArray *prhs)/* 对输入输出参数的个数进行判断,防止程序出错 */plhs0= mxCreate.plhs1= mxCreate.plhs2= mxCreate. 第3章 创建C语言MEX文件 /* 使用输入参数 prhs0,prhs1,prhs2和 prhs3完成相应的计算
12、 */* 将必要输出参数赋值给 plhs0,plhs1,和plhs2* /* 在程序退出之前释放必要的内存 */假设在MATLAB命令行中这样调用该MEX文件: x,y,z = myfunc(a,b,c,d); 第3章 创建C语言MEX文件 则在函数调用时输出参数的个数nlhs为3,输入参数的个数为4 ,输入参数的指针prhs0对应输入参数a,prhs1对应输入参 数b,prhs2对应输入参数c,prhs3对应输入参数d。在函数 的内部,必须对输出参数进行内存分配,于是使用mxCreate函 数分配内存,注意分配内存时需要针对具体的数据类型选择 mxCreate函数,然后在MEX文件中完成相应
13、的计算和处理。当MEX函数文件退出时,M解释器自动将输出参数的指针依 次赋值给实际的输出参数,既prhs0赋值给参数x,prhs1赋 值给参数y,prhs2赋值给参数z,所以不要将分配给输出参数 的内存释放掉。在simple.c源文件中也给出了编写使用MEX文件的基本原则 :在入口函数mexFunction中调用其它C语言函数,从而完成C语 言在MATLAB应用中的集成。 第3章 创建C语言MEX文件 3.3 创建MEX文件 创建MEX文件的时候,在MATLAB命令行中需要使用MEX指令 ,该指令是MATLAB产品的一部分,它主要完成以下功能: 清除内存中的已经加载的MEX函数; 调用系统脚本
14、(在操作系统中可以独立使用),完成MEX 文件生成。其中不同的操作系统平台上的系统脚本类型不一样,例如 在Windows平台上是Perl语言脚本,而在UNIX平台上则是B- shell脚本。 第3章 创建C语言MEX文件 3.3.1 MEX指令使用MEX指令不仅能够创建C语言的MEX文件, 而且还能够创建Fortran语言的MEX文件,具体创建的MEX文件类型是通过预先配置的编译器类型决定的。完整地执行MEX指令的命令行如下: mex option1 . optionN sourcefile1 . sourcefileN .objectfile1 . objectfileN libraryfi
15、le1 . libraryfileN其中,option1optionN是MEX指令的命令行参数选项;sourcefile为参与编译生成MEX文件的所有C文件;objectfile和libraryfile分别为对象文件和函数库文件。 第3章 创建C语言MEX文件 熟悉C语言或者Fortran语言的读者比较清楚,一般的高级编程语言从源代码到最终的可执行程序的生成过程包含两个步骤:第一个步骤是对源代码文件进行编译,这一步主要检查程序源代码是否有语法或者词法错误,将源文件编译成为目标文件;第二个步骤是链接过程,将源文件生成的目标文件和必要的库文件、其它的目标文件链接在一起,生成最终的可执行程序 文件。
16、在生成MEX文件时也是如此,只不过系统的MEX脚本将这一过程一次完成了,并且隐藏了其中的细节,如果需要对编译链接过程进行控制,则要通过设置相应的选项文件和命令行 开关来完成。在表3-2中总结了MEX脚本的命令行参数。 第3章 创建C语言MEX文件 表3-2 MEX脚本命令参数 第3章 创建C语言MEX文件 表3-2 MEX脚本命令参数 第3章 创建C语言MEX文件 使用上述命令行参数可以控制MEX文件的生成,例如创建包含下面内容的一个纯文本文件:-c -v -O -argcheck然后将该文件保存为test_rsp.txt,如果利用该文件完成MEX文件的编译,则可以在MATLAB命令行窗口中键入下面的指令: mex test_rs