Matlab混合编程7.ppt
《Matlab混合编程7.ppt》由会员分享,可在线阅读,更多相关《Matlab混合编程7.ppt(115页珍藏版)》请在三一办公上搜索。
1、Matlab语言 No.1,MATLAB基础篇、混合编程篇参考书:朱衡君 MATLAB 语言及实践教程(第2版)北京交通大学出版社 其它MATLAB混合编程参考书:杨高波 精通MATLAB7混合编程 电子工业出版社 刘维 精通MATLAB与C+混合程序设计 北航出版社 何强 MATLAB扩展编程 清华大学出版社,MATLAB混合编程篇,第7章 MATLAB外部接口概述第8章 创建C语言MEX文件,第7章 MATLAB外部接口概述,7.1 外部接口应用的类型7.2 mxArray数据结构7.3 mx函数应用7.4 MATLAB的环境配置,7.1 外部接口应用的类型,MATLAB同其它软件开发工具
2、或者语言交互的能力是非常强大的。1)特别是MATLAB在Windows平台上支持Microsoft提出的COM标准;2)同时支持Java语言;3)因此,MATLAB几乎可以同Windows平台上任何一种软件或者开发语言进行交互。不过,使用不同的工具解决不同的问题,往往一类问题又有很多种解决方法,但不是每一种都适合或者最佳。例如:在解决利用C语言调用MATLAB算法的问题上,可以分别通过计算引擎和MATLAB函数库的方法解决,但是不同的方法各有优点和缺点,需要针对用户的需要来选择。,表7-1 MATLAB与其它开发工具语言交互的能力,1.使用MEX文件调用已有的C代码或者Fortran代码创建M
3、EX文件是外部接口应用的重点,也是所讲述内容的重点。MEX从字面上是MATLAB Executable 两个单词的缩写。1)MEX文件类似于M文件,是一种能够在MATLAB环境中可以被 MATLAB的解释器解释并执行的函数文件;2)MEX文件可以直接使用C语言或者Fortran语言来编写,在相应的C语言或者Fortran语言代码中,就可以调用已有的大量C语言或者Fortran语言算法。3)在MATLAB中调用MEX文件时,就好像调用MATLAB的内建函数或者M文件函数一样,语法结构和输入、输出参数都符合MATLAB的标准。利用MEX文件可以完成:,利用MEX文件可以完成如下:*在MATLAB中
4、使用已有的C语言或者Fortran语言代码,避免重复劳动。*解决M语言运行速度的瓶颈。*隐藏算法的细节。*通过C语言对计算机硬件设备进行操作,扩展MATLAB的能力。,2.通过MATLAB计算引擎在C代码或者Fortran代码中调用MATLABMATLAB计算引擎应用程序是那些通过特殊的通信方式与MATLAB进程相互交互的C语言或者Fortran语言应用程序。1)计算引擎在不同的平台上使用不同的通信方法。例如在UNIX平台上使用管道(pipes),而在Windows平台上使用COM接口-IEngine。2)MATLAB计算引擎从应用上与MEX文件正好相对,它提供在C/Fortran语言应用程序
5、中调用MATLAB,将MATLAB作为后台计算处理平台的能力。,利用MATLAB计算引擎可以完成:1)利用C语言或者Fortran语言开发前台应用程序,调用MATLAB丰富的算法库,充分利用不同开发工具的优势和长处。2)在UNIX平台中,用户不仅可以在本地计算机上调用MATLAB计算引擎服务,而且可以通过网络调用其它计算机平台上的MATLAB计算引擎服务,充分利用网络上的计算资源。3)MATLAB的计算引擎应用简单、灵活。但是惟一的缺点:就是C语言或者Fortran语言开发的应用程序无法脱离MA TLAB环境,所以使得应用计算引擎必须安装一套MATLAB。,3.C语言或者Fortran语言应用
6、程序读写MAT数据文件MAT数据文件是MATLAB独有的一种数据文件格式,这种数据文件是一种二进制文件,能够跨平台使用。MAT数据文件的后缀名称是.mat。一般地,MAT数据文件都是在MATLAB环境中进行读写的,不过可以利用MATLAB提供的函数库完成:C语言或者Fortran语言读写MAT数据文件的程序开发,这样就能够充分利用MAT数据文件跨平台应用的优势了。,4.在M语言中调用Java类 MATLAB的Java接口包括:1)调用Java API类(class)和包(package),完成Java核心功能。2)调用第三方定义的Java类(class)。3)在MATLAB 环境下创建Java
7、对象。4)使用Java语法或MATLAB语法使用Java对象的方法。5)在Java对象和MATLAB之间交互数据。,5.在MATLAB中加载动态链接库Windows平台下的动态链接库包含了一组函数,这些函数可以被不同的应用程序来调用,这些文件就是共享库在Windo ws平台下的实现,这些文件的扩展名为.dll。在应用程序运行的时候,动态库被自动加载到内存中,利用库函数完成计算或者某些操作。MATLAB提供了相应的接口函数,可以将通用的动态链接库加载到MATLAB环境中,这样在M语言程序中就可以直接调用动态链接库包含的函数了。,注意:在MATLAB中加载动态链接库是MATLAB 6.5.1版新增
8、加的功能,MATLAB早期的版本还不具备这些能力。如果需要在MATLAB 6.5版本中实现加载动态链接库的功能,则需要在Mathworks公司的网站上下载一个补丁文件,该文件的超链接如下:ftp:/s33513/GenericDll_1p1.exe 将该文件下载并安装后,就可以在MATLAB 6.5中实现该功能了。,6.MATLAB的COM应用Windows 平台上的MATLAB可以完成COM客户端或者服务器应用程序的开发,尽管MATLAB的COM应用也是外部接口的内容,但是由于COM应用相对难度较大,涉及的软件工具种类多,所以关于COM应用的内容在MATLAB应用程序集成与发布一书中详细讲述
9、。同样有关动态数据交换(DDE)的内容也在MATLAB应用程序集成与发布一书中详细讲述。在上述各种外部接口应用中,最重要也是最常用的就是MEX文件,所以在本课程中,将重点讲解MEX文件的混合编程方法。,7.2 mxArray 数 据 结 构,1)Matlab 是以矩阵为基本单位的。2)与C语言不同,在C语言中,只有基本的双精度、整数、字符类型的变量定义,与MATLAB中的相应类型变量定义是不一样。3)为了能够在C语言中表示MATLAB的数据,MATLAB提供了一个特殊的C语言结构mxArray。4)这结构就是用来在C语言中表示MATLAB数据的,在MATLAB的C语言外部接口编程中将大量使用该
10、结构。,7.2 mxArray 数 据 结 构,7.2.1 mxArray的定义mxArray本身是一个C语言的结构(实现在C语言中表示MATLAB的数据),该结构的定义在Matrix.h文件中,它的定义如下:struct mxArray_tag void*reserved;int reserved12;void*reserved2;int number_of_dims;,unsigned int reserved3;struct unsigned int scalar_flag:1;unsigned int flag1:1;unsigned int flag2:1;unsigned int
11、flag3:1;unsigned int flag4:1;unsigned int flag5:1;unsigned int flag6:1;unsigned int flag7:1;unsigned int private_data_flag:1;unsigned int flag8:1;,unsigned int flag9:1;unsigned int flag10:1;unsigned int flag11:4;unsigned int flag12:8;unsigned int flag13:8;flags;unsigned int reserved42;union struct v
12、oid*pdata;void*pimag_data;void*reserved5;,int reserved63;number_array;data;,mxArray结构由很多个字段组成,这些字段完成了记录MATLAB数据的工作。一般地,mxArray在记录一个数据时,需要保存下列信息:数据类型。数组维数。与数组相关的数据(尺寸和数据)。如果是数值对象,则保存数据对象是实数还是虚数。如果是稀疏矩阵,则保存矩阵中非零元素的个数和索引。如果是结构和对象,则保存字段的数量和相应的名称。,从图7-1可以看出,mxArray将MATLAB数据的信息分别保存在不同的字段里;例如m和n分别表示二维矩阵的行数
13、和列数;对于多维数组,m是矩阵的行数,而n是数组中每一个矩阵的列数、页面数和其它数据的乘积。维数保存着数据对象实际的维数。而size字段存储着每个维存储数据元素的个数。pr为实部数据的指针,pi是虚部数据的指针,如果没有虚部数据,则pi为NULL。但是,在mxArray数据结构的定义中是不能直接找到这些字段的对应关系的,如果需要操作该数据对象,则需要使用专门的函数。,一般的情况下,直接操作mxArray对象比较困难,而且在使用mxArray数据对象时,都必须使用mxArray数据类型的指针来完成工作。为了便于创建和访问mxArray数据对象,MATLAB提供了相应的函数,这些函数就是MATLA
14、B提供的mx函数,该函数具有C语言的形式和Fortran语言的形式,利用这些函数不需要直接对mxArray结构对象的字段进行赋值或者读取了。关于C语言的mx函数创建数据对象的方法将在下一小节进行介绍,而详细的C语言和Fortran语言mx函数的解释请参阅MATLAB的帮助文档。,在进行外部接口编程时,获取数据类型信息是经常需要的一种操作。在mxArray结构中同样也保存着这样的信息,这类信息是通过mxClassID的枚举类型变量来保存的,该枚举类型定义如下:,typedef enum mxUNKNOWN_CLASS=0,mxCELL_CLASS,mxSTRUCT_CLASS,mxLOGICAL
15、_CLASS,mxCHAR_CLASS,mxSPARSE_CLASS,/*OBSOLETE!DO NOT USE*/,mxDOUBLE_CLASS,mxSINGLE_CLASS,mxINT8_CLASS,mxUINT8_CLASS,mxINT16_CLASS,mxUINT16_CLASS,mxINT32_CLASS,mxUINT32_CLASS,mxINT64_CLASS,/*place holder-future enhancements*/,mxUINT64_CLASS,/*place holder-future enhancements*/mxFUNCTION_CLASS,mxOPAQU
16、E_CLASS,mxOBJECT_CLASS mxClassID;,在MEX文件中进行数据类型判断时,将返回mxClassID类型的变量。此外,针对复数和实数也定义了一个枚举类型,该枚举类型的变量将在C语言应用程序中加以定义。它的定义如下:typedef enum mxREAL,mxCOMPLEX mxComplexity;,在C语言中创建mxArray数值类型对象需要指定数据是复数类型还是实数类型。为了能够保存字符串类型的变量,在Matrix.h文件中还专门定义了相应的数据类型mxChar。mxChar 是 mxArray存储字符类型数据时使用的变量类型,该数据类型使用了16位的无符号整数,
17、定义如下:typedef uint16_T mxChar;这里unit16_T是MATLAB自定义的数据类型符号,相当于C语言中unsigned int的定义。,为了便于用户学习外部接口编程,MATLAB也提供了相应的示例。在Windows平台下,这些示例都保存在MATLABROOT extern examples目录中,在mex子目录下都是相应的MEX函数文件例子,其中有一个实例文件名为explore.dll,它是一个C语言的MEX函数文件,功能是显示MATLAB数据对象的维数、尺寸和类型信息,将该文件拷贝到当前的工作路径下,然后在MATLAB中运行下面的指令:,x=3;explore(x)
18、-Name:prhs0Dimensions:1x1Class Name:double-(1,1)=3,在自己的MATLAB中运行下面的指令:explore(1 2 3 4 5)explore 1 2 3 4 5 explore(1 2 3 4 5)explore(int8(1 2 3 4 5)explore 1 2 3 4 5 explore(sparse(eye(5)explore(struct(name,Joe Jones,ext,7332)explore(1,2,3,4,5)可查看MATLAB相应的输出。,7.2.2 外部接口函数前一小节曾经提及为了完成创建、访问mxArray数据对象的
19、操作,MATLAB提供了相应的函数,这些函数是mx函数。mx函数是MATLAB外部接口函数的一种,针对不同外部接口应用,MATLAB提供了不同类型的函数,其中mx是这些函数共有的前缀。在表7-2中对C语言和Fortran语言外部接口应用程序中常用的函数进行了分类总结。,表7-2 MATLAB外部接口函数类型,7.3 mx 函 数 应 用,7.3.1 数值矩阵MATLAB中基本的数据类型有两种,一种是双精度数据,另外一种是字符串,其中双精度数据可以是标量、向量或者矩阵,也可以是多维的数组。MATLAB都将其看作矩阵或者数组,又由于这些数组或者矩阵的元素都是数字,因此又将其称之为数值矩阵或者数值数
20、组。本小节将介绍外部接口编程中通过mx函数创建使用数值矩阵的方法。,1.标量所谓标量,就是具有一个元素的矩阵,也就是11的矩阵。利用mx函数创建标量的方法非常简单,只需要用函数mxCreateDoubleScalar就可以了,该函数的C语言定义如下:mxArray*mxCreateDoubleScalar(double value);函数的输入参数是双精度类型的数据,可以是常量或者变量,而输出参数是mxArray数据结构的对象。使用该函数的方法参见下面的代码片段:,double realdata=1.0;mxArray*Data;/*创建mxArray数据对象-双精度标量*/Data=mxCr
21、eateDoubleScalar(realdata);见data.c,2.向量和矩阵由于在C语言中向量和矩阵都可以看作为二维数组,不过向量是1n或者n1的二维数组(矩阵),所以在C语言中创建向量和矩阵都是使用同一个函数。创建双精度类型矩阵可以使用mxCreateDoubleMatrix函数,该函数的定义如下:mxArray*mxCreateDoubleMatrix(int m,int n,mxComplexity ComplexFlag);,该函数的输入参数是:矩阵的行数m和列数n;以及数据是复数或者实数的标志。该函数若成功执行,则返回变量为mxArray数据结构的对象指针。若不能成功执行,则
22、在独立可执行应用程序中返回NULL,在MEX函数中返回MATLAB命令行窗口。通过该函数创建的双精度类型矩阵还没有实际的元素,而矩阵具体的元素的创建还需要通过另外的操作才能完成。创建双精度类型矩阵的完整过程参阅下面的代码片段:,double realdata=1,2,3,4,imagdata=1,2,3,4;double*pr,*pi;mxArray*Data;/int flag;/*创建mxArray数据对象-22复数矩阵*/Data=mxCreateDoubleMatrix(2,2,mxCOMPLEX);/*获取双精度类型矩阵的实部和虚部数据指针*/pr=mxGetPr(Data);pi=
23、mxGetPi(Data);/*复制数据完成赋值*/memcpy(pr,realdata,4*sizeof(double);memcpy(pi,imagdata,4*sizeof(double);见data1.c,在上面的代码片段中完成了双精度类型矩阵的创建,其中使用mxGetPr函数和mxGetPi函数获取了矩阵实部和虚部的指针,然后通过memcpy函数通过复制内存数据的方法完成整个矩阵数据的赋值。上述mxArray数据类型对象创建的过程完整地说明了在C语言中创建MATLAB数据对象的完整过程:首先使用mx函数创建指针完成mxArray数据类型指针的内存分配;然后通过mxGetPr和mxGe
24、tPi函数获取mxArray数据类型的实部数据指针和虚部数据指针;最后是用内存复制的方法完成数据的赋值。而操作mxArray类型数据指针的过程是通过mxGetPr和mxGetPi函数获取mxArray数据对象的指针,然后通过内存复制的方法将具体的数据赋值给相应的C语言双精度类型变量。,3.任意数值数组众所周知,除了双精度类型,MATLAB还支持整数类型、单精度类型等其它数值类型,也可以创建三维甚至更多维的数组。在外部接口应用中,通过不同函数可以完成同样的操作。如果需要创建任意类型数据的矩阵可以使用mxCreateNume ricMatrix函数,该函数的定义如下:mxArray*mxCreat
25、eNumericMatrix(int m,int n,mxClassID class,mxComplexity ComplexFlag);该函数的输入参数是:矩阵的行数m和列数n、矩阵的数据类型class以及实数或者复数的标志。,下面的代码片段说明了创建32位整数类型复数矩阵的方法:/*实部数据和虚部数据*/long realdata=1,2;long imagdata=1,2;/*实部虚部数据的指针*/long*pr,*pi;mxArray*Data;/*创建mxArray数据对象-双精度标量*/Data=mxCreateNumericMatrix(1,2,mxINT32_CLASS,mxC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 混合 编程

链接地址:https://www.31ppt.com/p-5598982.html