MATLAB外部接口编程(张威) 第3章

上传人:E**** 文档编号:89373565 上传时间:2019-05-24 格式:PPT 页数:151 大小:1.68MB
返回 下载 相关 举报
MATLAB外部接口编程(张威) 第3章_第1页
第1页 / 共151页
MATLAB外部接口编程(张威) 第3章_第2页
第2页 / 共151页
MATLAB外部接口编程(张威) 第3章_第3页
第3页 / 共151页
MATLAB外部接口编程(张威) 第3章_第4页
第4页 / 共151页
MATLAB外部接口编程(张威) 第3章_第5页
第5页 / 共151页
点击查看更多>>
资源描述

《MATLAB外部接口编程(张威) 第3章》由会员分享,可在线阅读,更多相关《MATLAB外部接口编程(张威) 第3章(151页珍藏版)》请在金锄头文库上搜索。

1、第3章 创建C语言MEX文件,3.1 MEX文件简介 3.2 MEX源文件的结构 3.3 创建MEX文件 3.4 MEX文件的内存管理 3.5 MEX文件示例 3.6 调试MEX文件 本章小结 练习,3.1 MEX文件简介,MEX从字面上是MATLAB和Executable两个单词的缩写。一般地MEX文件使用C语言或者Fortran语言进行开发,通过适当的编译之后,生成的目标文件能够被M语言解释器调用执行。MEX文件在使用上和M函数文件非常类似,但是由于M语言解释器解析指令具有优先级特性,所以MEX文件总是被优先执行。, 例3-1 简单MEX文件示例mexHelloWorld.c。 001 /

2、* 必需的头文件 */ 002 #include “mex.h“; 003 /* MEX函数的入口函数 */ 004 void mexFunction(int nlhs, mxArray *plhs, 005 int nrhs, const mxArray *prhs) 006 007 /*函数的内容,调用其它C函数 */ 008 mexPrintf(“Hello MATALB World!“); 009 ,首先请读者使用任何一种能够编辑纯文本文件的编辑器,例如Windows平台下的记事本,UNIX平台下的vi等,也可以使用MATLAB提供的meditor,将上面的代码键入到文件中。注意,不要

3、将行号(001009)也敲进去,在这里设置行号的主要目的是为了便于讲解和分析程序。 然后将该文件保存,设置文件名称为mexHelloWorld.c,将该文件拷贝或者保存到MATLAB的当前工作路径下。 接着,在MATLAB的命令行窗口下键入下面的指令: mex mexHelloWorld.c,其中,“”表示敲回车键。这个命令行有两个部分,mex为编译器指令,mexHelloWorld.c就是用户创建的C文件。注意,在这里需要给出C文件的扩展名。 如果编辑的应用程序没有任何错误,则MATLAB命令行中不会显示任何消息;否则,在MATLAB命令行中将显示相应的错误消息提示。一般常见的错误是拼写错误

4、,例如没有区分大小写字母、语句结尾没有分号“;”等。如果出现编译错误,请仔细查看键入的源程序代码,修改错误直到编译通过为止。,编译的结果是创建出MATLAB的MEX文件,可以在MATLAB命令行下键入what指令查看当前路径下是否具有MEX文件。 what MEX-files in the current directory D:Temp mexHelloWorld 接着,运行创建的MEX文件,在MATLAB命令行中键入下面的指令: mexHelloWorld Hello MATALB World!,例3-1的MEX文件的功能就是在MATLAB命令行下输出一条文本信息。还可以在MATLAB命令

5、行窗口中键入下面的指令: which mexHelloWorld D:TempmexHelloWorld.dll which指令可以查看当前执行的指令或者函数具体的位置或者类型。可以发现,在Windows平台下MEX文件的扩展名称为.dll。不同操作系统平台下的MEX文件扩展名称不尽相同,读者可以在自己的平台下,在MATLAB命令行中使用mexext指令获取当前平台下MEX文件的扩展名,在表3-1中总结了这些文件的扩展名类型。,表3-1 MEX文件的扩展名,上述编译MEX文件的过程同样可以在操作系统的控制台下完成,例如在Windows平台下,在命令行提示符窗口中,直接键入mex mexFile

6、name.c也可以完成MEX文件的编译。注意,mexFilename.c文件一定在当前的路径下。在命令行提示符窗口中同样可以完成系统编译器的配置。 提示:控制台方式 控制台方式这个名词应该是来自于UNIX/Linux操作系统。而在Windows 9x操作系统中,为了照顾大多数从MS-DOS操作系统过渡到Windows操作系统的用户,Windows提供了一个可以运行在Windows图形界面中的字符界面 MS-DOS窗口,叫作MS-DOS方式。在Windows 2000系统中叫作命令提示符。,3.2 MEX源文件的结构,3.2.1 源文件的基本结构 C语言MEX源文件是标准的C语言源文件,其程序的

7、基本语法完完全全是ANSI C的语法结构。所以,请读者注意,某些C/C+编译器不仅仅支持标准C语言的语法,可能还支持一些特殊的C语法结构,例如Microsoft Visual C/C+ 6.0的编译器支持以“/”的形式添加程序注释,这些特殊的程序特性最好不要出现在C语言MEX源文件中,以免影响了程序的可移植特性。,在例3-1中程序的第002行包含了一个头文件mex.h,在所有C语言的MEX源文件中必须包含该头文件,该头文件位于%MATLABROOT%externinclude路径下。在这个头文件中完成了所有C语言MEX函数的原型声明,同时还包含了matrix.h文件。matrix.h文件包含了

8、第2章介绍的若干mx函数和数据类型的声明和定义,所以在编写C语言MEX源文件的时候,就不必在C文件中再次包含matrix.h文件了。,例3-1的源文件第004行和005行为C语言MEX源文件的入口函数部分。这两行代码是所有C语言MEX源文件必须包含的内容,而且书写的内容也必须按照固定的格式,也就是说必须按照例子中的书写方法来表示这两行代码: void mexFunction(int nlhs, mxArray *plhs, int nrhs, const mxArray *prhs),mexFunction函数的作用类似C语言源文件的main函数,它是MEX文件的入口函数。当在MATLAB命令

9、行中执行MEX函数时,MATLAB解释器将从此函数开始执行MEX代码。 该入口函数的输入参数有四个,其意义分别是: nlhs:表示输入参数的个数。 Plhs:mxArray类型的指针数组,表示MEX函数的输入参数。 Nrhs:表示输出参数的个数。 Prhs:mxArray类型的指针数组,表示MEX函数的输出参数。,其实上述输入、输出参数的名称非常容易记忆,lhs代表Left hand parameters,rhs代表right hand parameters,n代表number,p代表pointer。这里的左手和右手如何划分呢?例如在MATLAB中调用求伯特图的函数时,可以这样表示: mag,

10、phase,w = bode(sys) 这里以“=”为分界,左边的参数mag、phase和w为输出参数,即左手参数,而等号右边的参数sys为输入参数,即右手参数。,3.2.2 MEX文件的参数 在MEX应用程序中判断用户的输入参数和输出参数是否满足要求是非常重要的一个操作,参见下面的例子。 例3-2 判断输出参数simple.c。 001 #include “mex.h“ 002 /* 函数声明,在MEX入口函数内部调用 */ 003 int AssignNumericData(double *pr, int size); 004 005 /* MEX 文件入口函数*/,006 void me

11、xFunction(int nlhs, mxArray *plhs, 007 int nrhs, const mxArray *prhs) 008 009 /*变量声明 */ 010 mxArray * mystr; 011 int flag; 012 char myprintchar100,mychar= “This is a simple MEX-File “; 013 014 /* 判断输出参数个数,必须具有一个输出参数*/ 015 if(nlhs != 1) 016 mexErrMsgTxt(“必须给一个输出参数!“); 017,018 /* 创建字符串mxArray数据对象 019

12、创建数据对象的同时赋初值 */ 020 mystr = mxCreateString(mychar); 021 /* 创建双精度类型mxArray数据对象 022 该数据对象是函数的输出 023 创建时,数据对象为空,该数据将被AssignNumericData函数赋值*/ 024 plhs0 = mxCreateDoubleMatrix(2,3,mxREAL); 025 026 /* 双精度类型mxArray数据对象赋值 */,027 flag = AssignNumericData(mxGetPr(plhs0), 028 mxGetNumberOfElements(plhs0); 029

13、030 /* 输出字符串 */ 031 mxGetString(mystr,myprintchar, 032 mxGetNumberOfElements(mystr)*mxGetElementSize(mystr); 033 mexPrintf(myprintchar); 034 035 /* 退出 mexFunction 函数时,释放必要的内存空间*/ 036 mxDestroyArray(mystr); 037 ,038 /* 算法函数 */ 039 int AssignNumericData(double *pr, int size) 040 041 double data=1.,2.,

14、3.,4.,5.,6.; 042 memcpy(pr,data,size*sizeof(double); 043 return(EXIT_SUCCESS); 044 ,例3-2的代码尽管比较长,却是一个完整的C语言MEX应用程序。请读者注意程序的014016行,在这三行代码中对输出参数的个数进行了判断,要求执行该函数的时候必须给定一个输出。在MATLAB中编译并执行该程序:, mex simple.c simple ? 必须给一个输入参数! Error in = D:Tempsimple.dll a b = simple ? 必须给一个输入参数! Error in = D:Tempsimple

15、.dll a = simple This is a simple MEX-File a = 1 3 5 2 4 6,在执行simple.c程序时,命令行中必须给定合适的输出参数,否则根据程序中的判断将给出错误的信息,该信息是通过mexErrMsgTxt函数给出的,该函数的详细解释可以参阅MATLAB的帮助文档,在3.5小节中,还会再次使用该函数来控制程序的错误。 请读者留意程序的021024行,在MEX函数源文件中,必须对输出参数占用的内存空间进行合理的分配,否则会造成内存泄漏等异常错误。所谓合理的分配就是设置符合要求的数据类型和数组元素个数。那么mexFunction入口函数的参数和MATL

16、AB函数的输入、输出参数之间究竟是怎样对应的呢?查看下面的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. .,/* 使用输入参数 prhs0,prhs1,prhs2和 prhs3 完成相应的计算 */ /* 将必要输出参数赋值给 plhs0,plhs1,和plhs2* / /* 在程序退出之前释放

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号