版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023/2/4机械工业出版社Page1第8章MATLAB与C/C++混合编程【学习目标】了解MATLAB的外部编程接口熟悉MATLAB与C/C++的混合编程方法掌握使用MAT文件按实现数据交互掌握使用共享库实现混合编程掌握使用MEX文件实现混合编程掌握使用MATLAB引擎实现混合编程掌握使用编译器实现混合编程2023/2/4机械工业出版社Page2第8章MATLAB与C/C++混合编程MATLAB混合编程该韩素8.1使用MAT文件实现数据交互8.2使用共享库实现混合编程8.3使用MEX文件实现混合编程8.4使用MATLAB编译器实现混合编程8.6使用MATLAB引擎实现混合编程8.52023/2/4机械工业出版社Page38.1MATLAB混合编程概述8.1.1MATLAB外部接口简介8.1.2常用MATLAB与C/C++混合编程方法2023/2/4机械工业出版社Page4MATLAB应用程序接口是MATLAB与外部程序和数据进行交互的通道,通过MATLAB应用程序接口,可以实现MATLAB与其它高级编程语言的混合编程。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page5MATLAB提供的外部接口包括:数据共享接口、外部程序接口、COM客户端和服务器自动化接口以及外设数据交换接口。另外,MATLAB还为用户提供了MATLAB编译器,可进一步发挥MATLAB的计算与图形操作威力。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page6MATLAB数据交互接口MATLAB通过MAT文件与其它编程平台实现数据交互。MAT文件是MATLAB数据存储默认的文件格式,其文件名以.mat为后缀。MATLAB为用户提供了一系列操作MAT文件的API函数,可以利用这些函数实现对MAT文件的访问。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page7MATLAB共享库接口共享库是一组可以在程序运行时动态加载的函数的集合,不同平台下的共享库有不同的形式;Windows的共享库是指动态连接库,后缀为.dll,UNIX和Linux下的共享库是指共享对象文件,后缀为.so。MATLAB提供在MATLAB中调用共享库的接口函数,可以实现共享库的加载、释放、参数传递和函数调用等操作。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page8MATLAB外部程序接口MATLAB通过MEX文件实现与外部程序的连接。MEX是MATLABExecutable的缩写,即MATLAB可执行程序。MEX文件是MATLAB调用其它编程语言编写的程序或算法的接口,符合MATLAB的调用格式,可以被MATLAB解释器载入执行。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page9MATLAB引擎MATLAB引擎是一组允许用户在其它应用程序中与MATLAB交互的函数接口库。通过这些接口函数,用户可以在C、C++和Fortran等高级编程语言中实现对MATLAB的控制,将MATLAB作为一种计算引擎使用。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page10MATLAB编译器MATLAB编译器是MATLAB环境下的编译工具,它能将M文件转换为C或C++等不同类型的源代码、MEX文件、可独立运行的应用程序文件或组件。MATLAB还为Java、.NET和Excel提供了单独的Builder,可以实现M文件到Java类、.NET组件和Exceladd-ins的转换。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page11MATLAB的Java接口MATLAB的Java接口是在MATLAB环境中运行和使用Java程序所提供的函数库。通过MATLAB接口,用户可以在MATLAB中直接访问JavaAPI,在工作空间创建Java对象和调用Java对象方法。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page12MATLAB的.NET接口MATLAB的.NET接口是新版本MATLAB中为实现MATLAB与.NET的交互而引入的接口函数。通过MATLAB的.NET接口,用户可以在MATLAB工作空间中创建.NET类实例,还可以通过类成员与.NET应用程序进行交互。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page13MATLAB的COM交互接口MATLAB既可以充当COM客户,控制其它组件,也可以充当自动化服务器,被其它组件所控制。MATLAB支持四种不同的COM客户/服务器设置方式:MATLAB客户和进程内服务器、MATLAB客户和进程外服务器、客户程序和MATLAB自动化服务器以及客户程序和MATLAB引擎服务器。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page14MATLAB的WebServices接口WebServices是一种允许分布在不同区域、运行不同操作系统和开发环境的计算机相互间进行通信的技术。利用WebServices,客户端可以访问并执行远程服务器上所提供的Web服务。MATLAB可以充当WebServices的客户端,通过MATLAB的WebServices接口对服务器提供的WebServices进行访问。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page15MATLAB的串行I/O接口串口是计算机同外部设备进行通信的重要接口。通过MATLAB提供的串行I/O接口,用户可以直接访问通过串口连接在计算机上的打印机、调制解调器等外部设备。该串行I/O接口建立在串行I/O对象之上,借助该对象所支持的函数和属性,用户可以配置串口通信、读写数据并将信息记录存盘。8.1.1MATLAB外部接口简介2023/2/4机械工业出版社Page16C/C++语言有着庞大的用户群和强大的生命力,在当前计算机软件开发中占据着相当重要的位置。将MATLAB与C/C++相结合,可以发挥各自优势,缩短开发周期,提高开发效率。8.1.2常用MATLAB与C/C++混合编程方法2023/2/4机械工业出版社Page17使用MAT文件实现程序的数据交互;利用C/C++创建共享库文件实现MATLAB对C/C++程序的调用;利用C/C++创建MEX文件实现MATLAB对C/C++程序的调用;利用MATLAB引擎实现C/C++对MATLAB的调用;利用MATLAB编译器实现MATLAB与C/C++的混合编程;8.1.2常用MATLAB与C/C++混合编程方法2023/2/4机械工业出版社Page188.2使用MAT文件实现数据交互8.2.1MAT文件简介8.2.2操作MAT文件的API8.2.3编译和链接MAT程序的配置8.2.4MAT文件实现数据交互实例2023/2/4机械工业出版社Page19MAT文件是MATLAB专用的数据存储格式,也是其默认的文件格式。MAT文件以.mat为后缀,文件中数据以二进制格式保存,用户一般只能在MATLAB载入MAT文件后,通过变量编辑器实现对MAT文件的修改。8.2.1MAT文件简介2023/2/4机械工业出版社Page20MAT文件由文件头和紧随其后的数据单位组成。MAT文件头又可分为MATLAB的版本信息、操作平台的信息和文件创建的时间共三部分。文件头共128字节,type命令可查看。8.2.1MAT文件简介2023/2/4机械工业出版社Page21为了简化在MATLAB之外的环境中使用MAT文件,MATLAB提供了一系列的API,用于实现MAT文件的读写。利用API对MAT文件进行读写,无需了解MAT文件的内部格式,而且当MATLAB升级时,即使MAT文件的版本发生了改变也无需重写用户代码。MATLAB强烈建议用户使用MATLAB提供的API实现MAT文件的读写。8.2.2操作MAT文件的API函数2023/2/4机械工业出版社Page22操作MAT文件的API包括MAT文件函数库和MX矩阵函数库。MAT文件函数库以mat为前缀,所有函数在头文件mat.h中声明,主要用于MAT文件的创建和读写。MX矩阵函数库以mx为前缀,所有函数在头文件matrix.h中进行声明,主要用于矩阵元素的创建和操作。8.2.2操作MAT文件的API函数2023/2/4机械工业出版社Page238.2.2操作MAT文件的API函数函数说
明matOpen打开一个MAT文件matClose关闭一个MAT文件matGetDir获取MAT文件中的MATLAB数组列表matGetFp获取一个指向MAT文件的ANSIC文件指针matGetVariable从MAT文件中读取一个MATLAB数组matPutVariable将一个MATLAB数组写入MAT文件matGetNextVariable从MAT文件中读取下一个MATLAB数组matDeleteVariable将一个MATLAB数组从MAT文件中删除matPutVariableAsGlobal将一个MATLAB数组作为全局变量写入MAT文件matGetVariableInfo从一个MAT文件中载入一个MATLAB数组头matGetNextVariableInfo从一个MAT文件中载入下一个MATLAB数组头2023/2/4机械工业出版社Page248.2.2操作MAT文件的API函数函数说
明mxCreateLogicalArray创建一个N维的逻辑mxArray类型的矩阵,初始化为falsemxCreateLogicalMatrix创建一个二维的逻辑mxArray类型的矩阵,初始化为falsemxCreateDoubleMatrix创建一个二维的双精度浮点mxArray矩阵,初始化为0mxCreateSparse创建一个二维的稀疏矩阵mxCreateString按指定的字符串创建一个字符串数组mxCreateCellMatrix创建一个二维的空数组,每个元素都为NULLmxCreateStructArray用指定的字段创建一个N维的结构体数组,初始化为NULLmxDestroyArray释放由mxCreate*函数所分配的动态内存2023/2/4机械工业出版社Page258.2.2操作MAT文件的API函数函数说
明mxGetM获取数组第一维元素的个数mxGetN获取数组除第一维其它维上元素的个数(矩阵的列数)mxGetDimensions获取数组各维上元素的个数mxSetM设置mxArray类型矩阵的行数mxSetN设置mxArray类型矩阵的列数mxGetPr获取double类型数组的实部数据指针mxGetPi获取double类型数组的虚部数据指针mxSetPr为double类型数组设置新的实部数据mxSetPi为double类型数组设置新的虚部数据2023/2/4机械工业出版社Page26为了在C/C++开发环境中编译和链接调用MAT文件接口函数的程序,用户必须进行必要的环境设置。本小节介绍在MATLAB平台利用mex命令和在VS2005开发环境中编译、链接MAT程序的环境配置。8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page27MATLAB平台mex命令环境配置MATLAB借助mex命令和MAT属性文件来实现C/C++MAT程序的编译和链接。MAT属性文件位于目录【matlabroot\bin\win32\mexopts\】下,文件名为“*engmatopts.bat”,其中,*代表编译器的类型和版本号。8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page28MATLAB平台mex命令环境配置假若当前工作目录下存在一个名为matcreat.c的C程序,利用微软VisualC++Version8.0(VS2005)将其编译为独立的可执行程序,则需要在MATLAB中输入下面的命令行代码:若当前操作系统并未安装VisualC++Version8.0,MATLAB会提示“无法定位编译器”的错误信息。8.2.3编译和链接MAT程序环境配置mex-fmatlabroot\bin\win32\mexopts\msvc80engmatopts.batmatcreat.c2023/2/4机械工业出版社Page29MATLAB平台mex命令环境配置在mex命令后加入-setup参数可查看当前系统安装的C/C++和Fortran编译器:8.2.3编译和链接MAT程序环境配置>>mex-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?ySelectacompiler:[1]Lcc-win32C2.4.1inC:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\ProgramFiles\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\ProgramFiles\MicrosoftVisualStudio[0]None2023/2/4机械工业出版社Page30VS2005平台开发MAT程序环境配置利用mex命令可以实现C/C++程序的编译链接,当程序包含多个文件时,用这种命令行方法编译程序就不是很方便。VisualC++是Windows系统下最受欢迎的C/C++开发环境,可以管理和开发大规模的C/C++程序,下面介绍在VS2005下编译、链接MAT程序的环境配置。8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page31VS2005平台开发MAT程序环境配置1.将【matlabroot\extern\include】加入为包含目录(mat.h和matrix.h
所在目录)8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page32VS2005平台开发MAT程序环境配置2.【matlabroot\extern\lib\win32\microsoft】设置为库目录(MAT接口和矩阵库所在目录)8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page33VS2005平台开发MAT程序环境配置3.工程属性页中加入对libmat.lib和libmx.lib两个库文件的链接8.2.3编译和链接MAT程序环境配置2023/2/4机械工业出版社Page348.2.4MAT文件实现数据交互实例【例8-1】编写C程序,通过MATAPI创建一个MAT文件,并在MATLAB中查看创建的MAT文件的内容。为简化代码编写过程,我们以MATLAB自带的示例代码matcreat.c为基础创建MAT文件,具体步骤如下:2023/2/4机械工业出版社Page35在VS2005中新建一个空的VisualC++Win32控制台应用程序,项目名称为“CreateMatFileTest”;将目录【matlabroot\extern\examples\eng_mat\】下的matcreat.c拷贝到当前项目目录中,并通过【项目】菜单下的【添加现有项】子菜单将文件matcreat.c加入当前工程。修改matcreat.c,保留程序创建MAT文件相关代码8.2.4MAT文件实现数据交互实例2023/2/4机械工业出版社Page36为当前项目加入依赖连接库文件libmat.lib和libmx.lib;编译、链接工程,并运行程序;撰写MATLAB程序,读取MAT文件内容具体代码参见光盘实例源码。8.2.4MAT文件实现数据交互实例2023/2/4机械工业出版社Page378.2.4MAT文件实现数据交互实例2023/2/4机械工业出版社Page388.3使用共享库实现混合编程8.3.1MATLAB调用共享库函数8.3.2给共享库中的函数传递参数8.3.3私用libpointer/libstruct对象8.3.4使用共享库实现混合编程实例2023/2/4机械工业出版社Page39
共享库是一组可以在程序运行时动态加载的函数的集合,在windows平台中共享库就是动态连接库(DLL)。在MATLAB中要访问共享库中的函数,首先必须载入共享库。共享库被载入后,利用MATLAB提供的查看列表命令可以查看共享库中包含的函数,在完成函数调用后,需要卸载共享库。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page40
共享库是一组可以在程序运行时动态加载的函数的集合,在windows平台中共享库就是动态连接库(DLL)。在MATLAB中要访问共享库中的函数,首先必须载入共享库。共享库被载入后,利用MATLAB提供的查看列表命令可以查看共享库中包含的函数,在完成函数调用后,需要卸载共享库。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page41共享库载入函数函数loadlibrary载入共享库,函数语法形式如下:loadlibrary('shrlib','hfile')shrlib是共享库文件名称;hfile是包含函数原型的头文件的名称。如:hfile=[matlabroot'\extern\include\matrix.h']8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page42共享库卸载函数函数unloadlibrary卸载共享库,函数语法形式如下:
unloadlibrary('libname')
unloadlibrary
libnamelibname:共享库名。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page43共享库查看函数MATLAB提供了两个查看函数。
libfunctions函数语法形式如下:m=libfunctions('libname')m=libfunctions('libname','-full')libname:共享库名;'-full':表示显示函数的详细信息;m:返回值,是一个字符串型的单元阵列,包含函数信息。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page44共享库查看函数libfunctionsview函数语法形式如下:
libfunctionsview('libname')libfunctions在命令窗口中显示共享库中函数libfunctionsview在图形用户界面中显示共享库中函数。带-full参数的函数返回共享库中所有函数的完全描述。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page45共享库调用函数函数calllib调用共享库中的函数,函数语法形式如下:[x1,...,xN]=calllib('libname', 'funcname',arg1,…,argN)libname:调用函数所在共享库的名称;funcname:调用函数的名称;arg1…argN:为函数传入的参数;x1…xN:函数返回值。8.3.1MATLAB调用共享库函数2023/2/4机械工业出版社Page46C与MATLAB数据类型对应关系8.3.2给共享库中的函数传递参数C语言数据类型对应MATLAB数据类型char,byteint8unsignedchar,byteuint8shortint16unsignedshortuint16intint32long(32bit)int32long(64bit)int64unsignedint,unsignedlonguint32floatsingledoubledouble2023/2/4机械工业出版社Page47C与MATLAB数据类型对应关系(续)8.3.2给共享库中的函数传递参数C语言数据类型对应MATLAB数据类型char*cstring(1×n字符数组)*char[]字符串单元数组int*(u)int(size)Ptr字符串cstring字符串引用stringPtr字符串指针数组stringPtrPtr有符号字节矩阵int8Ptrfloat*singlePtrdouble*doublePtrmxArray*MATLABarrayvoid*voidPtrvoid**voidPtrPtrtype**typePtrPtr2023/2/4机械工业出版社Page48参数传递原则非标量数据类型的函数参数必须声明为引用调用(passbyreference);当函数参数为二维矩阵时,需要将输入矩阵转置后再传给处理函数,对函数的返回结果也要做转置处理。这是因为C语言与MATLAB矩阵元素的单下标索引顺序不同,前者是行优先,而后者是列优先;8.3.2给共享库中的函数传递参数2023/2/4机械工业出版社Page49参数传递原则(续)当函数参数是数组类型,并且数组维数在二维以上时,为保持数组形状,需要在调用函数之前备份数组形状信息,这样在函数调用后就可以利用备份的数组形状信息恢复数组原来的形状;当函数参数为指针类型时,用空数组[]来传递一个NULL参数值。8.3.2给共享库中的函数传递参数2023/2/4机械工业出版社Page50传递原生类型参数当需要传递的函数参数为MATLAB原生数据类型时,MATLAB自动将MATLAB中的数据转换为外部函数参数所需的数据类型。例如,外部函数输入参数为short类型,用户可以将double类型的数据作为输入参数传入,MATLAB会自动将double类型数据转换为外部函数所需的short类型参数。8.3.2给共享库中的函数传递参数2023/2/4机械工业出版社Page51传递字符串参数当外部共享库函数包含char*型参数时,可以将MATLAB字符串作为参数传入,即MATLAB中的字符串等同于C语言中的char*。即:MATLAB中的cstring变量与共享库函数中的char*变量相对应。8.3.2给共享库中的函数传递参数2023/2/4机械工业出版社Page52传递指针参数若共享库中函数的参数为引用型参数(指针或引用),传入对应的数值型参数即可,MATLAB会自动将传入的数值型参数转换为对应的引用型参数。
如:8.3.2给共享库中的函数传递参数doubleaddDoubloeByRef(doublex,double*y);calllib(‘libname’,‘addDoubleByRef’,1.5,2,6)2023/2/4机械工业出版社Page53很多时候,需要传入引用型参数而不能传入数值型参数。如想对输入参数的值进行更改或传入的数据占用很多的存储空间时,就需要使用引用型参数。针对上述情况,MATLAB为用户提供了libpointer对象和libstruct对象。8.3.3使用libpointer/libstruct对象传递参数2023/2/4机械工业出版社Page54创建libpointer对象libpointer函数用来创建libpointer对象,函数语法形式如下:p=libpointer('type','value')type:创建指针所指向的数据类型,如int32Ptr等;value:为指针对象赋予的初始值;p:返回的指针对象。8.3.3使用libpointer/libstruct对象传递参数2023/2/4机械工业出版社Page55创建指向原生数据类型变量的指针假如存在double型变量x,现在需要创建一个指向x的libpointer对象,代码如下:8.3.3使用libpointer/libstruct对象传递参数>>x=10;>>xp=libpointer('doublePtr',x);>>get(xp)Value:10
DataType:'doublePtr'xp即是我们创建的指向变量x的double类型libpointer对象。2023/2/4机械工业出版社Page56通过既有libpointer创建指针在已有libpointer对象的基础上,利用加号运算符(+)用户很容易创建新的libpointer对象。创建新指针的过程与C语言中利用偏移创建新指针类似。8.3.3使用libpointer/libstruct对象传递参数>>x=1:8;>>xp=libpointer('doublePtr',x);>>xp2=xp+3;>>xp2.Valueans=456782023/2/4机械工业出版社Page57MEX文件是用C/C++或Fortran编写,遵循MEX文件格式的,可被MATLAB直接调用的一种文件。MATLA将MEX文件中的函数视为它的内建函数,MATLAB解释器可以自动载入并执行它们。MEX文件有二进制MEX文件和MEX源文件之分,一般情况下指的是二进制MEX文件。8.4.1MEX文件简介2023/2/4机械工业出版社Page58利用libpointer创建指向结构体的指针当函数的参数为结构体类型时,传入的参数可以是结构体也是以是指向结构体的指针。8.3.3使用libpointer/libstruct对象传递参数>>sx.v1=499.99;sx.v2=122;sx.v3=-210;>>sp=libpointer('c_struct',sx);>>sp.Valueans=v1:499.99v2:122v3:-210struct
c_struct{doublev1;shortv2;longv3;};2023/2/4机械工业出版社Page59利用libstruct创建指向结构体的指针libstruct函数也可用于创建结构体对象,libstruct语法形式如下:
s=libstruct('structtype',mlstruct)'structtype':指定所创建对象的结构体类型mlstruct:为所创建结构体对象赋予的初值s:返回所创建的libstruct对象。8.3.3使用libpointer/libstruct对象传递参数根据C语言中的结构体类型structtype来创建libstruct对象,并根据mlstruct为对象的域赋初值。2023/2/4机械工业出版社Page608.3.4使用共享库实现混合编程实例【例8-2】已知共享库libname中包含函数addDoubleByRef和addStructByRef,定义如下页,编写MATLAB程序,利用libpointer对象和libstruct对象传递参数调用函数。(假定libname共享库的头文件为libname.h)2023/2/4机械工业出版社Page618.3.4使用共享库实现混合编程实例doubleaddDoubleByRef(doublex,double*yp){ returnx+*y;}struct
c_struct{doublev1;shortv2;longv3;};doubleaddStructByRef(struct
c_struct*st){ doublet=st->v1+st->v2+st->v3;
st->v1*=2;
st->v2*=2;
st->v2*=2; returnt;}2023/2/4机械工业出版社Page62loadlibrary('libname','libname.h')
%装载libname共享库x=1.2;%创建doublePtr类型libpointer对象yp=libpointer('doublePtr',x);
%调用函数addDoubleByRefcalllib('libname','addDoubleByRef',2.3,yp);
%创建结构体对象smsm.v1=1.2;sm.v2=-27;sm.v3=145;%利用sm创建指向结构体的指针sp=libpointer('c_struct',sm);
calllib('libname','addStructByRef',sm)
%传入结构体对象calllib(‘libname’,‘addStructByRef’,sp)
%传入libpointer对象%利用sm创建指向结构体的指针sc=libstruct('c_struct',sm);
%调用函数addStructByRef,传入calllib('libname','addStructByRef',sc)
get(sc)%get函数查看sc的值unloadlibrary
libname
%卸载libname共享库2023/2/4机械工业出版社Page638.4使用MEX文件实现混合编程8.4.1MEX文件简介8.4.2使用MEX文件环境配置8.4.3C语言MEX函数8.4.4C语言创建MEX文件实例8.4.5C++语言创建MEX文件实例2023/2/4机械工业出版社Page64MEX文件是用C/C++或Fortran编写,遵循MEX文件格式的,可被MATLAB直接调用的一种文件。MATLA将MEX文件中的函数视为它的内建函数,MATLAB解释器可以自动载入并执行它们。MEX文件有二进制MEX文件和MEX源文件之分,一般情况下指的是二进制MEX文件。8.4.1MEX文件简介2023/2/4机械工业出版社Page65MEX文件用途可以直接调用已有的大量C/C++或者Fortran程序,而无需将他们用MATLAB重新改写;用C/C++或者Frotran语言编写那些在MATLAB中运算速度过慢的算法以提高效率,如包含大量的逐元素处理的循环运算等直接控制硬件,如A/D采集卡,D/A输出卡等,以用于数据采集或控制应用。8.4.1MEX文件简介2023/2/4机械工业出版社Page66MEX源文件结构MEX源文件是指用C/C++或Fortan语言所编写的遵循MEX文件格式的源代码文件。C语言MEX源文件由三部分组成:第一部分:头文件包含及宏定义;第二部分:计算例程,即在MEX源文件中完成计算功能的程序代码,计算程序可以是普通的C/C++程序,按照C/C++语言规则编写即可;第三部分:入口例程,即将计算例程与MATLAB连接的入口函数mexFunction。8.4.1MEX文件简介2023/2/4机械工业出版社Page67MEX源文件结构-mexFunction声明8.4.1MEX文件简介voidmexFunction(
int
nlhs, /*期望输出参数个数*/
mxArray*plhs[], /*指向输出参数的指针数组*/
int
nrhs, /*期望的输入参数个数*/constmxArray*prhs[] /*执行输入参数的指针数组*/)nlhs:输出数据的个数;plhs:指向mxArray类型输出数据的指针;nrhs:输入数据的个数;prhs:指向mxArray类型输入数据的指针。2023/2/4机械工业出版社Page68二进制MEX文件二进制MEX文件是程序运行时动态加载的一种共享库。二进制MEX文件有自己的平台无关的后缀,用mex命令创建二进制MEX文件时该后缀会自动生成。在32位Windows平台中,二进制MEX文件的后缀是.mexw32,在64位Windows平台中,其后缀为.mexw64。未来版本本,dll后缀MEX文件不再支持。8.4.1MEX文件简介2023/2/4机械工业出版社Page69在8.2.3中,已经对mex命令的环境配置做过初步介绍,这里基于WindowsXP操作系统和MATLAB2010a,详细介绍mex命令的环境配置。8.4.2使用MEX文件的环境配置
在MATLAB命令提示符下,输入mex配置命令,显示如下信息:>>mex-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikemextolocateinstalledcompilers[y]/n?2023/2/4机械工业出版社Page70选择“y”,mex命令会列出找到的MATLAB所支持的指编译器及其安装目录,如:8.4.2使用MEX文件的环境配置Selectacompiler:[1]Lcc-win32C2.4.1in C:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\Program Files\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\Program Files\MicrosoftVisualStudio[0]None2023/2/4机械工业出版社Page71选择[1]-[3]中的任一项,mex命令将给出提示信息:8.4.2使用MEX文件的环境配置Compiler:MicrosoftVisualC++2005SP1Location:C:\ProgramFiles\MicrosoftVisualStudio8
Arethesecorrect[y]/n?2023/2/4机械工业出版社Page72确认所选择编译器及安装路径正确无误后,选择“y”,mex命令将对系统进行配置,若成功将给出如下提示:8.4.2使用MEX文件的环境配置Tryingtoupdateoptionsfile:C:\DocumentsandSettings\Administrator\ApplicationData\MathWorks\MATLAB\R2010a\mexopts.bat
Fromtemplate:C:\PROGRA~1\MATLAB\R2010a\bin\win32\mexopts\msvc80opts.bat
Done...2023/2/4机械工业出版社Page73MEX编译选项设置mex命令要借助编译选项来实现MEX文件的编译。mex命令的语法形式为:
mexfilename-foptionsfile-f参数指明使用选项文件optionsfile来编译MEX文件;当mex命令不指定选项文件时,MATLAB使用默认的选项文件。8.4.2使用MEX文件的环境配置2023/2/4机械工业出版社Page74户也可以利用VS2005平台创建MEX文件。用C/C++语言开发MEX程序,一般要调用MEX函数库(libmex.dll)和矩阵函数库(libmx.dll),要实现MEX程序的正确编译,用户必须首先对VS2005的包含文件目录和库文件目录进行配置,然后加入相应库文件的链接即可。8.4.2使用MEX文件的环境配置2023/2/4机械工业出版社Page75
MEX函数库是MATLAB外部程序接口函数库提供的一系列函数,它们均以mex为前缀,主要实现与MATLAB环境的交互。下页表中列出了MATLABC语言MEX函数库提供的接口函数及其功能介绍。8.4.3C语言MEX函数2023/2/4机械工业出版社Page76函数功能介绍mexAtExit登记一个函数,该函数在MEX文件被清除或者MATLAB终止执行时被调用,用来完成释放内存等善后工作mexCallMATLAB调用MATLAB自建函数、用户自定义函数或MEX文件mexCallMATLABWithTrap调用MATLAB自建函数、用户自定义函数或MEX文件,并捕获函数运行的错误信息mexErrMsgIdAndTxt输出带标识符的错误信息,并返回到MATLAB命令提示符下mexErrMsgTxt输出错误信息,并返回到MATLAB命令提示符下mexEvalString在调用者工作空间执行MATLAB命令mexEvalStringWithTrap在调用者工作空间执行MATLAB命令,并捕获函数运行的错误信息mexFunctionC/C++和Fortran语言MEX文件的入口点函数mexFunctionName获取当前执行MEX文件的文件名mexGet获取某一指定图像句柄的属性2023/2/4机械工业出版社Page77函数功能介绍mexGetVariable获取特定工作空间中变量的拷贝mexGetVariablePtr获取另一个工作空间中变量的只读指针mexIsGlobal判断mxArray变量是否具有作用域mexIsLocked判断MEX文件是否处于锁定状态mexLock锁定一个MEX文件mexMakeArrayPersistent将一个mxArray变量转换为持久阵列对象mexMakeMemoryPersistent将MATLAB程序内存转换为持久阵列对象mexPrint与C语言的输出函数Printf的输出功能相同mexPutVariable将mxArray变量从MEX函数中复制到指定工作空间mexSet用于设定某个图形句柄对象的属性值mexSetTrapFlag控制mexCallMATLAB函数对错误处理的响应mexUnlock解锁MEX文件,将MEX文件从内存中清除mexWarnMsgIdAndTxt输出带标识符的警告信息mexWarnMsgTxt输出警告信息2023/2/4机械工业出版社Page788.4.4C语言创建MEX文件实例【例8-3】利用C语言创建MEX文件示例:编写C程序实现标量与数组相乘实例源码见文件arrayProduct.c,该文件包括三个部分:第一部分:包含MEX函数库头文件第二部分:计算例程第三部分:入口例程函数2023/2/4机械工业出版社Page798.4.4C语言创建MEX文件实例/*第一部分:包含MEX函数库头文件*/#include"mex.h“/*第二部分:计算例程*/voidarrayProduct(doublex,double*y,double*z,
mwSizen){
mwSizei;/*multiplyeachelementybyx*/for(i=0;i<n;i++){
z[i]=x*y[i];}}2023/2/4机械工业出版社Page808.4.4C语言创建MEX文件实例/*第三部分:入口例程函数*/voidmexFunction(int
nlhs,mxArray*plhs[],
int
nrhs,constmxArray*prhs[]){doublemultiplier;/*inputscalar*/double*inMatrix;/*1xNinputmatrix*/
mwSize
ncols;/*sizeofmatrix*/double*outMatrix;/*outputmatrix*/
/*检查输入输出参数个数是否正确*/
if(nrhs!=2){}
if(nlhs!=1){}/*确认第一个输入参数为标量*/if(!mxIsDouble(prhs[0])||mxIsComplex(prhs[0])||mxGetNumberOfElements(prhs[0])!=1){}2023/2/4机械工业出版社Page818.4.4C语言创建MEX文件实例/*确认第二个输入参数只有一行,即为一维数组*/if(mxGetM(prhs[1])!=1){}
/*获取参数*/multiplier=mxGetScalar(prhs[0]);
inMatrix=mxGetPr(prhs[1]);
ncols=mxGetN(prhs[1]);plhs[0]=mxCreateDoubleMatrix(1,ncols,mxREAL);
outMatrix=mxGetPr(plhs[0]);
/*调用计算例程*/
arrayProduct(multiplier,inMatrix,outMatrix,ncols);}2023/2/4机械工业出版社Page828.4.4C语言创建MEX文件实例利用mex命令或VS2005编译文件arrayProduct.c,生成MEX文件arrayProduct.mexw32,在MATLAB中调用arrayProduct函数,结果如下:>>A=arrayProduct(2,[1:4])A=24682023/2/4机械工业出版社Page838.4.5C++语言创建MEX文件实例【例8-4】用C++语言创建MEX文件示例:定义一个类MyData,创建该类的实例对象,并为对象赋值,显示对象赋值前后的内容。实例源码请参见光盘:例8-4目录下的mexcpp.cpp文件。2023/2/4机械工业出版社Page848.4.5C++语言创建MEX文件实例C++语言MEX源文件结构与例8-3中的C语言MEX源文件结构类似,同样也包含三个主要部分:头文件包含部分、计算例程和入口例程;不同的是,C++语言撰写的MEX源文件中增加了类的定义,并在计算例程中创建类的对象,并调用对象的函数,在对象使用完毕需要释放对象。2023/2/4机械工业出版社Page858.4.5C++语言创建MEX文件实例利用mex命令或VS2005编译文件mexcpp.cpp,生成文件mexcpp.mexw32,在MATLAB中调用mexcpp函数,结果如下:>>mexcpp(2,3)Theinitializeddatainobject:Value1=0Value2=0Aftersettingtheobject'sdatatoyourinput:Value1=2Value2=32023/2/4机械工业出版社Page868.5使用MATLAB引擎实现混合编程8.5.1MATLAB引擎简介8.5.2MATLAB引擎函数8.5.3MATLAB引擎的使用8.5.4VS2005开发MATLAB引擎实例2023/2/4机械工业出版社Page87MATLAB引擎是MATLAB提供的一组外部接口函数。通过这些接口函数,用户可以在C和Fortran等高级编程语言中实现对MATLAB的控制,将MATLAB作为一种计算引擎使用。8.5.1MATLAB引擎简介2023/2/4机械工业出版社Page88MATLAB引擎程序采用C、C++或Fortran语言编写,通过引擎接口与MATLAB进行交互。在UNIX系统中,引擎程序通过通道来和一个独立的MATLAB进程通信,在Windows系统中,则是通过组件对象模型(COM)接口来与MATLAB进行交互。8.5.1MATLAB引擎简介2023/2/4机械工业出版社Page89借助MATLAB引擎,用户可以实现:在C/C++中调用MATLAB的数学函数或子程序来完成数据的处理。在C/C++中调用MATLAB来构建针对某个特殊任务的整个系统。将MATLAB部署在计算能力更强的计算机上,通过网络运行MATLAB引擎实现资源的充分利用。8.5.1MATLAB引擎简介2023/2/4机械工业出版社Page90MATLAB引擎库包含一系列从外部应用程序调用和控制MATLAB引擎的函数。这些函数以eng为前缀,其C语言接口函数声明都包含在头文件engine.h中。下页表中列出了MATLAB引擎接口函数及其功能介绍。8.5.2MATLAB引擎函数2023/2/4机械工业出版社Page918.5.2MATLAB引擎函数函数功能介绍engOpen启动MATLAB计算引擎engClose关闭MATLAB引擎engGetVariable从MATLAB工作空间获得一个MATLAB数组engPutVariable将指定名称的MATLAB数组存入MATLAB工作空间engEvalString执行一个MATLAB命令engOutputBuffer创建字符缓冲区,以获取MATLAB文本输出engOpenSingleUse打开一个单独的非共享的MATLAB计算引擎engGetVisible返回MATLAB引擎显示状态engSetVisible设置MATLAB引擎的显示或隐藏状态2023/2/4机械工业出版社Page92在外部程序中调用MATLAB引擎,大致包含如下几个步骤:打开MATALAB引擎;将输入数据转换成MATLAB引擎空间中使用的形式;将上一步转换得到的数据放入MATLAB计算引擎的工作空间;8.5.3MATLAB引擎的使用2023/2/4机械工业出版社Page93调用函数engEvalString向MATLAB引擎发送命令字符串,执行MATLAB操作或运算;从预先定义的缓冲区获取MATLAB引擎的输出结果;关闭引擎,释放内存空间。8.5.3MATLAB引擎的使用2023/2/4机械工业出版社Page948.5.3MATLAB引擎的使用【例8-5】C语言调用MATLAB引擎示例。编写C程序,给定时间数组T,利用MATLAB引擎计算距离为时间的函数D=.5.*(-9.8).*T.^2;"),并调用MATLAB绘图函数plot绘制二维曲线,最后将计算结果打印到控制台中。一维时间数组T=[0.0,1.0,2.0,3.0,4.0,5.0,6.0,7.0,8.0,9.0]2023/2/4机械工业出版社Page958.5.3MATLAB引擎的使用源码engdemo.c包括六个步骤:步骤一:开启MATLAB引擎;步骤二:创建mxArray类型变量T,并将C语言数组time中数据拷贝到T中;步骤三:将变量T载入MATLAB工作空间步骤四:向MATLAB引擎传递命令,计算距离为时间的函数并绘制结果;步骤五:获取计算结果;步骤六:释放内存空间,关闭引擎2023/2/4机械工业出版社Page96VS2005是Windows平台下非常出色的C/C++开发工具,本小节介绍如何在VS2005中开发MATLAB引擎程序。8.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page97VS2005环境配置
将目录【matlabroot\extern\include】配置为VS2005的包含文件目录;【matlabroot\extern\lib\win32\microsoft】配置为VS2005的库文件目录;将MEX函数库(libmex.dll)和矩阵函数库(libmx.dll)加为工程的链接文件。
具体步骤可参考节8.2.3。8.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page98VS2005平台开发MATLAB引擎程序新建一个空的Win32控制台应用程序项目;8.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page99VS2005平台开发MATLAB引擎程序将例8-5中的源代码engdemo.c拷贝至项目engdemo工作目录下,并添加至当前工程;按照前面讲述的连接库导入方式在项目配置属性中导入libmex.lib、libmx.lib和libeng.lib三个库文件;编译运行程序。程序运行结果如下两页图所示。8.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page1008.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page1018.5.4VS2005开发引擎程序实例2023/2/4机械工业出版社Page1028.6使用MATLAB编译器实现混合编程8.6.1MATLAB编译器简介8.6.2编译器的安装与配置8.6.3编译和部署MATLAB程序8.6.4使用编译器混合编程实例2023/2/4机械工业出版社Page103MATLAB编译器是MATLAB环境下的编译工具。它能将M文件转换成C/C++等不同类型的源代码,并在此基础上根据需要生成MEX文件或可独立运行的应用程序文件,从而大大提供代码的执行效率。与前面介绍的MATLAB引擎和MEX文件相比,有着更高的执行效率和更广泛的应用范围。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page104MATLAB编译器的使用
MATLAB编译器利用mcc命令将M文件转换为C/C++文件,同时生成一个相应的包裹文件。该包裹文件包含编译器产生的代码和它所支持的可执行文件类型之间所必须的接口。利用该包裹文件提供的接口,生成的C/C++文件可用于创建C/C++编译器所支持的多种类型可执行文件。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page105MATLAB编译器的使用
mcc命令的语法形式如下:mcc[options]mfile1[mfile2…mfileN]… [C/C++file1…C/C++fileN]options:指定函数的编译参数;mfile1…mfileN:需编译的m文件;C/C++file1…C/C++fileN:需编译的C/C++文件。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page106MATLAB编译器的使用
常用的options参数包括:-m:生成可独立运行应用程序,等同于–Wmain–Tlink:exe;-l:生成函数库,等同于–Wlib–Tlink:lib;-I:指定新的包含目录;-g:编译时生成调式信息;-d:指定输出目录。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page107MATLAB编译器的使用
常用的options参数包括:-T<option>:指定编译步骤和目标文件类,option可以是codegen、compile:exe、compile:lib、link:exe或link:lib;-W<option>:指定生成包裹函数的类型,option可以是main、lib:<string>、cpplib:<string>或non。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page108MATLAB编译器的使用
mcc命令常见的几种使用方式:-mcc–mmfile1mfile2mcc–m–Iincludepath–doutputpath
mfilemcc–lmfilemcc–Wlib:libname–Tlink:libmfile1mfile28.6.1MATLAB编译器简介除mcc命令外,MATLAB还为用户提供了图形化的编译、部署工具DeploymentTool,其使用在第9章中介绍。2023/2/4机械工业出版社Page109编译M文件的原因可以获得更快的运行速度;可以实现算法的隐藏;能够缩短项目开发周期;无需MATLAB计算环境的支持就可创建可独立运行的应用程序和共享库。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page110MATLAB编译器的局限不能编译脚本M文件;不能编译使用对象的M文件;不用编译使用input和eval语句操作工作空间变量的M文件;不能编译动态命名;不讲编译MATLAB内建函数。8.6.1MATLAB编译器简介2023/2/4机械工业出版社Page111在使用MATLAB编译器之前,需要安装MATLAB编译器和相关的C/C++编译器,并进行相关配置。8.6.2编译器的安装与配置2023/2/4机械工业出版社Page112安装MATLAB编译器
在安装MATLAB编译器之前,需要安装一个或多个与MATLAB兼容的ANSIC/C++编译器,包括Lcc(MATLAB自带的C语言编译器,不能编译C++代码)、MicrosoftVisualC++、gcc和g++。MATLAB编译器是MATLAB的一个组件,在MATLAB2010a中版本为4.12,在安装MATLAB2010a时选中该组件即可。8.6.2编译器的安装与配置2023/2/4机械工业出版社Page1138.6.2编译器的安装与配置2023/2/4机械工业出版社Page114配置MATLAB编译器
MATLAB编译器只是完成m文件到C/C++文件的转换,C/C++代码的编译是调用mbuild命令来完成的。所以在完成C/C++编译器和MATLAB编译器的安装后,还需要对mbuild进行配置。8.6.2编译器的安装与配置2023/2/4机械工业出版社Page115配置MATLAB编译器
在MATLAB命令提示符下,输入mbuild配置命令:
系统将显示如下内容:8.6.2编译器的安装与配置>>mbuild-setupPleasechooseyourcompilerforbuildingexternalinterface(MEX)files:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?2023/2/4机械工业出版社Page116配置MATLAB编译器
输入“y”,mbuild命令会列出找到的MATLAB所支持的指编译器及其安装目录,如下所示:
8.6.2编译器的安装与配置Selectacompiler:[1]Lcc-win32C2.4.1in C:\PROGRA~1\MATLAB\R2010a\sys\lcc[2]MicrosoftVisualC++2005SP1inC:\Program Files\MicrosoftVisualStudio8[3]MicrosoftVisualC++6.0inC:\Program Files\MicrosoftVisualStudio[0]None2023/2/4机械工业出版社Page117配置MATLAB编译器
选择[1]-[3]中的任一项,mbuild命令将给出提示信息。选择2给出的提示信息如下:8.6.2编译器的安装与配置Compiler:MicrosoftVisualC++2005SP1Locati
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度城市夜景亮化工程项目合同
- 桥梁加固工程合同
- 二零二四年度影视版权购买与许可合同3篇
- 干洗店转让合同
- 2024年度版权许可使用合同:电影《未来之城》2篇
- 娱乐城DJ招聘合同
- 体育场馆设备仓房租赁合同
- 高速公路养护施工员合同模板
- 在线教育平台教师托管合同
- 2024年度智能家居系统研发销售合同3篇
- 深圳大学《西方文明史》2023-2024学年第一学期期末试卷
- 湖北省武汉市部分学校2024-2025学年高一上学期11月期中调研数学试题(含答案)
- 《诗意的色彩》课件 2024-2025学年人美版(2024)初中美术七年级上册
- 创新方法论智慧树知到期末考试答案章节答案2024年西安理工大学
- 部编版五年级道德与法治上册第7课《中华民族一家亲》精美课件
- (高清版)JTGT 3610-2019 公路路基施工技术规范
- 大学生的自己的职业生涯规划
- 2024年基金应知应会考试试题及答案
- 法律逻辑案例分析
- 软件工程师生涯人物访谈报告
- 全过程造价咨询服务方案(技术标)
评论
0/150
提交评论