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
3、代码或者Fortran代码 创建MEX文件是外部接口应用的重点,也是所讲述内容的重点。MEX从字面上是MATLAB Executable 两个单词的缩写。 1)MEX文件类似于M文件,是一种能够在MATLAB环境中可以被 MATLAB的解释器解释并执行的函数文件; 2)MEX文件可以直接使用C语言或者Fortran语言来编写,在相应的C语言或者Fortran语言代码中,就可以调用已有的大量C语言或者Fortran语言算法。 3)在MATLAB中调用MEX文件时,就好像调用MATLAB的内建函数或者M文件函数一样,语法结构和输入、输出参数都符合MATLAB的标准。 利用MEX文件可以完成:,利用
4、MEX文件可以完成如下: * 在MATLAB中使用已有的C语言或者Fortran语言代码,避免重复劳动。 * 解决M语言运行速度的瓶颈。 * 隐藏算法的细节。 * 通过C语言对计算机硬件设备进行操作,扩展MATLAB的能力。,2. 通过MATLAB计算引擎在C代码或者Fortran代码中调用MATLAB MATLAB计算引擎应用程序是那些通过特殊的通信方式与MATLAB进程相互交互的C语言或者Fortran语言应用程序。 1)计算引擎在不同的平台上使用不同的通信方法。 例如在UNIX平台上使用管道(pipes),而在Windows平台上使用COM接口-IEngine。 2)MATLAB计算引擎
5、从应用上与MEX文件正好相对,它提供在C/Fortran语言应用程序中调用MATLAB,将MATLAB作为后台计算处理平台的能力。,利用MATLAB计算引擎可以完成: 1) 利用C语言或者Fortran语言开发前台应用程序,调用MATLAB丰富的算法库,充分利用不同开发工具的优势和长处。 2)在UNIX平台中,用户不仅可以在本地计算机上调用MATLAB计算引擎服务,而且可以通过网络调用其它计算机平台上的MATLAB计算引擎服务,充分利用网络上的计算资源。 3)MATLAB的计算引擎应用简单、灵活。但是惟一的缺点:就是C语言或者Fortran语言开发的应用程序无法脱离MA TLAB环境,所以使得
6、应用计算引擎必须安装一套MATLAB。,3. C语言或者Fortran语言应用程序读写MAT数据文件 MAT数据文件是MATLAB独有的一种数据文件格式,这种数据文件是一种二进制文件,能够跨平台使用。MAT数据文件的后缀名称是.mat。 一般地,MAT数据文件都是在MATLAB环境中进行读写的,不过可以利用MATLAB提供的函数库完成: C语言或者Fortran语言读写MAT数据文件的程序开发,这样就能够充分利用MAT数据文件跨平台应用的优势了。,4. 在M语言中调用Java类 MATLAB的Java接口包括: 1)调用Java API类(class)和包(package),完成Java核心功
7、能。 2) 调用第三方定义的Java类(class)。 3)在MATLAB 环境下创建Java对象。 4)使用Java语法或MATLAB语法使用Java对象的方法。 5) 在Java对象和MATLAB之间交互数据。,5. 在MATLAB中加载动态链接库 Windows平台下的动态链接库包含了一组函数,这些函数可以被不同的应用程序来调用,这些文件就是共享库在Windo ws平台下的实现,这些文件的扩展名为.dll。 在应用程序运行的时候,动态库被自动加载到内存中,利用库函数完成计算或者某些操作。 MATLAB提供了相应的接口函数,可以将通用的动态链接库加载到MATLAB环境中,这样在M语言程序中
8、就可以直接调用动态链接库包含的函数了。,注意: 在MATLAB中加载动态链接库是MATLAB 6.5.1版新增加的功能, MATLAB早期的版本还不具备这些能力。如果需要在MATLAB 6.5版本中实现加载动态链接库的功能,则需要在Mathworks公司的网站上下载一个补丁文件,该文件的超链接如下: ftp:/ /s33513/GenericDll_1p1.exe 将该文件下载并安装后,就可以在MATLAB 6.5中实现该功能了。,6. MATLAB的COM应用 Windows 平台上的MATLAB可以完成COM客户端或者服务器应用程序的开发,尽管MATLAB的COM应用也是外部接口的内容,但
9、是由于COM应用相对难度较大,涉及的软件工具种类多,所以关于COM应用的内容在MATLAB应用程序集成与发布一书中详细讲述。 同样有关动态数据交换(DDE)的内容也在MATLAB应用程序集成与发布一书中详细讲述。 在上述各种外部接口应用中,最重要也是最常用的就是MEX文件,所以在本课程中,将重点讲解MEX文件的混合编程方法。,7.2 mxArray 数 据 结 构,1)Matlab 是以矩阵为基本单位的。 2)与C语言不同,在C语言中,只有基本的双精度、整数、字符类型的变量定义,与MATLAB中的相应类型变量定义是不一样。 3)为了能够在C语言中表示MATLAB的数据,MATLAB提供了一个特
10、殊的C语言结构mxArray。 4)这结构就是用来在C语言中表示MATLAB数据的,在MATLAB的C语言外部接口编程中将大量使用该结构。,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
11、 int scalar_flag : 1; unsigned int flag1 : 1; unsigned int flag2 : 1; unsigned int 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; u
12、nsigned int flag11 : 4; unsigned int flag12 : 8; unsigned int flag13 : 8; flags; unsigned int reserved42; union struct void *pdata; void *pimag_data; void *reserved5;,int reserved63; number_array; data; ;,mxArray结构由很多个字段组成,这些字段完成了记录MATLAB数据的工作。一般地,mxArray在记录一个数据时,需要保存下列信息: 数据类型。 数组维数。 与数组相关的数据(尺寸和数据
13、)。 如果是数值对象,则保存数据对象是实数还是虚数。 如果是稀疏矩阵,则保存矩阵中非零元素的个数和索引。 如果是结构和对象,则保存字段的数量和相应的名称。,从图7-1可以看出,mxArray将MATLAB数据的信息分别保存在不同的字段里; 例如m和n分别表示二维矩阵的行数和列数;对于多维数组,m是矩阵的行数,而n是数组中每一个矩阵的列数、页面数和其它数据的乘积。维数保存着数据对象实际的维数。 而size字段存储着每个维存储数据元素的个数。 pr为实部数据的指针,pi是虚部数据的指针,如果没有虚部数据,则pi为NULL。 但是,在mxArray数据结构的定义中是不能直接找到这些字段的对应关系的,
14、如果需要操作该数据对象,则需要使用专门的函数。,一般的情况下,直接操作mxArray对象比较困难,而且在使用mxArray数据对象时,都必须使用mxArray数据类型的指针来完成工作。 为了便于创建和访问mxArray数据对象,MATLAB提供了相应的函数,这些函数就是MATLAB提供的mx函数,该函数具有C语言的形式和Fortran语言的形式,利用这些函数不需要直接对mxArray结构对象的字段进行赋值或者读取了。 关于C语言的mx函数创建数据对象的方法将在下一小节进行介绍,而详细的C语言和Fortran语言mx函数的解释请参阅MATLAB的帮助文档。,在进行外部接口编程时,获取数据类型信息
15、是经常需要的一种操作。在mxArray结构中同样也保存着这样的信息,这类信息是通过mxClassID的枚举类型变量来保存的,该枚举类型定义如下:,typedef enum mxUNKNOWN_CLASS = 0, mxCELL_CLASS, mxSTRUCT_CLASS, mxLOGICAL_CLASS, mxCHAR_CLASS, mxSPARSE_CLASS, /* OBSOLETE! DO NOT USE */,mxDOUBLE_CLASS, mxSINGLE_CLASS, mxINT8_CLASS, mxUINT8_CLASS, mxINT16_CLASS, mxUINT16_CLAS
16、S, mxINT32_CLASS, mxUINT32_CLASS, mxINT64_CLASS, /* place holder - future enhancements */,mxUINT64_CLASS, /* place holder - future enhancements */ mxFUNCTION_CLASS, mxOPAQUE_CLASS, mxOBJECT_CLASS mxClassID;,在MEX文件中进行数据类型判断时,将返回mxClassID类型的变量。 此外,针对复数和实数也定义了一个枚举类型,该枚举类型的变量将在C语言应用程序中加以定义。它的定义如下: typed
17、ef enum mxREAL, mxCOMPLEX mxComplexity;,在C语言中创建mxArray数值类型对象需要指定数据是复数类型还是实数类型。 为了能够保存字符串类型的变量,在Matrix.h文件中还专门定义了相应的数据类型mxChar。mxChar 是 mxArray存储字符类型数据时使用的变量类型,该数据类型使用了16位的无符号整数,定义如下: typedef uint16_T mxChar; 这里unit16_T是MATLAB自定义的数据类型符号,相当于C语言中unsigned int的定义。,为了便于用户学习外部接口编程,MATLAB也提供了相应的示例。 在Windows
18、平台下,这些示例都保存在MATLABROOT extern examples目录中,在mex子目录下都是相应的MEX函数文件例子, 其中有一个实例文件名为explore.dll,它是一个C语言的MEX函数文件,功能是显示MATLAB数据对象的维数、尺寸和类型信息,将该文件拷贝到当前的工作路径下,然后在MATLAB中运行下面的指令:, x = 3; explore(x) - Name: prhs0 Dimensions: 1x1 Class Name: double - (1,1) = 3,在自己的MATLAB中运行下面的指令: explore (1 2 3 4 5) explore 1 2 3
19、 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数据对象的操作,MATLAB提供了相应的函数,这些函数是mx函数。 mx函数是MATLAB外部接口函数的一种,针对不同外部接口应用,MATLAB提供了不同类型的函数,其中mx是这些
20、函数共有的前缀。 在表7-2中对C语言和Fortran语言外部接口应用程序中常用的函数进行了分类总结。,表7-2 MATLAB外部接口函数类型,7.3 mx 函 数 应 用,7.3.1 数值矩阵 MATLAB中基本的数据类型有两种,一种是双精度数据,另外一种是字符串,其中双精度数据可以是标量、向量或者矩阵,也可以是多维的数组。 MATLAB都将其看作矩阵或者数组,又由于这些数组或者矩阵的元素都是数字,因此又将其称之为数值矩阵或者数值数组。本小节将介绍外部接口编程中通过mx函数创建使用数值矩阵的方法。,1. 标量 所谓标量,就是具有一个元素的矩阵,也就是11的矩阵。利用mx函数创建标量的方法非常
21、简单,只需要用函数mxCreateDoubleScalar就可以了,该函数的C语言定义如下: mxArray *mxCreateDoubleScalar(double value); 函数的输入参数是双精度类型的数据,可以是常量或者变量,而输出参数是mxArray数据结构的对象。使用该函数的方法参见下面的代码片段:,double realdata = 1.0; mxArray *Data; /* 创建mxArray数据对象- 双精度标量 */ Data = mxCreateDoubleScalar(realdata); 见data.c,2. 向量和矩阵 由于在C语言中向量和矩阵都可以看作为二维
22、数组,不过向量是1n或者n1的二维数组(矩阵),所以在C语言中创建向量和矩阵都是使用同一个函数。 创建双精度类型矩阵可以使用mxCreateDoubleMatrix函数,该函数的定义如下: mxArray *mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag);,该函数的输入参数是: 矩阵的行数m和列数n; 以及数据是复数或者实数的标志。 该函数若成功执行,则返回变量为mxArray数据结构的对象指针。若不能成功执行,则在独立可执行应用程序中返回NULL,在MEX函数中返回MATLAB命令行窗口。 通过该函数创建的双精度类型矩
23、阵还没有实际的元素,而矩阵具体的元素的创建还需要通过另外的操作才能完成。创建双精度类型矩阵的完整过程参阅下面的代码片段:,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 = mxGetPi(Data); /*复制数据完成赋值*/ memc
24、py(pr,realdata,4*sizeof(double); memcpy(pi,imagdata,4*sizeof(double); 见data1.c,在上面的代码片段中完成了双精度类型矩阵的创建, 其中使用mxGetPr函数和mxGetPi函数获取了矩阵实部和虚部的指针, 然后通过memcpy函数通过复制内存数据的方法完成整个矩阵数据的赋值。上述mxArray数据类型对象创建的过程完整地说明了在C语言中创建MATLAB数据对象的完整过程: 首先使用mx函数创建指针完成mxArray数据类型指针的内存分配; 然后通过mxGetPr和mxGetPi函数获取mxArray数据类型的实部数据指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Matlab 混合 编程
链接地址:https://www.31doc.com/p-2202140.html