




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第7章 matlab外部接口概述 matlab语言 no.1matlab基础篇、混合编程篇参考书基础篇、混合编程篇参考书: 朱衡君朱衡君 matlab 语言及实践教程(第语言及实践教程(第2版)版) 北京交通大学出版社北京交通大学出版社 其它其它matlab混合编程参考书混合编程参考书: 杨高波杨高波 精通精通matlab7混合编程混合编程 电子工业出版社电子工业出版社 刘维刘维 精通精通matlab与与c+混合程序设计混合程序设计 北航出版社北航出版社 何强何强 matlab扩展编程扩展编程 清华大学出版社清华大学出版社 第7章 matlab外部接口概述 matlab混合编程混合编程篇篇 第
2、第7章章 matlab外部接口概述外部接口概述第第8章章 创建创建c语言语言mex文件文件 第7章 matlab外部接口概述 第7章 matlab外部接口概述 7.1 外部接口应用的类型外部接口应用的类型7.2 mxarray数据结构数据结构7.3 mx函数应用函数应用7.4 matlab的环境配置的环境配置第7章 matlab外部接口概述 7.1 外部接口应用的类型外部接口应用的类型 matlab同其它软件开发工具或者语言交互的能力是非常强大的。 1) 特别是matlab在windows平台上支持microsoft提出的com标准; 2) 同时支持java语言; 3) 因此,matlab几乎
3、可以同windows平台上任何一种软件或者开发语言进行交互。 不过,使用不同的工具解决不同的问题,往往一类问题又有很多种解决方法,但不是每一种都适合或者最佳。 例如:在解决利用c语言调用matlab算法的问题上,可以分别通过计算引擎和matlab函数库的方法解决,但是不同的方法各有优点和缺点,需要针对用户的需要来选择。 第7章 matlab外部接口概述 表表7-1 matlab与其它开发工具语言交互的能力与其它开发工具语言交互的能力 问 题 解决方法 需要工具 在matlab中调用c或者fortran语言代码 mex 文件 matlab 计算引擎 matlab 在 c 语言中调用 matlab
4、 算法 matlab 函数库 matlab、matlab compiler 在 fortran 语言中调用 matlab 算法 计算引擎 matlab com 应用 matlab matlab com 客户端/服务器开发 visual basic/excel 程序中调用 matlab matlab 组件打包 matlab、 matlab compiler、matlab com builder、 matlab excel builder 在c语言/fortran语言中读写mat 数据文件 mat 应用 matlab m 语言中调用 java 类 java 语言 matlab 加载动态链接库函数
5、直接加载 matlab 第7章 matlab外部接口概述 1. 1. 使用使用mexmex文件调用已有的文件调用已有的c c代码或者代码或者fortranfortran代码代码创建mex文件是外部接口应用的重点,也是所讲述内容的重点。mex从字面上是matlab executable 两个单词的缩写。 1)mex文件类似于m文件,是一种能够在matlab环境中可以被 matlab的解释器解释并执行的函数文件; 2)mex文件可以直接使用c语言或者fortran语言来编写,在相应的c语言或者fortran语言代码中,就可以调用已有的大量c语言或者fortran语言算法。 3)在matlab中调用
6、mex文件时,就好像调用matlab的内建函数或者m文件函数一样,语法结构和输入、输出参数都符合matlab的标准。利用mex文件可以完成: 第7章 matlab外部接口概述 利用mex文件可以完成如下: * 在matlab中使用已有的c语言或者fortran语言代码,避免重复劳动。* 解决m语言运行速度的瓶颈。* 隐藏算法的细节。* 通过c语言对计算机硬件设备进行操作,扩展matlab的能力。 第7章 matlab外部接口概述 2. 2. 通过通过matlabmatlab计算引擎在计算引擎在c c代码或者代码或者fortranfortran代码中调用代码中调用matlabmatlabmatl
7、ab计算引擎应用程序是那些通过特殊的通信方式与matlab进程相互交互的c语言或者fortran语言应用程序。 1)计算引擎在不同的平台上使用不同的通信方法。 例如在unix平台上使用管道(pipes),而在windows平台上使用com接口-iengine。2)matlab计算引擎从应用上与mex文件正好相对,它提供在c/fortran语言应用程序中调用matlab,将matlab作为后台计算处理平台的能力。第7章 matlab外部接口概述 利用matlab计算引擎可以完成: 1) 利用c语言或者fortran语言开发前台应用程序,调用matlab丰富的算法库,充分利用不同开发工具的优势和长
8、处。 2)在unix平台中,用户不仅可以在本地计算机上调用matlab计算引擎服务,而且可以通过网络调用其它计算机平台上的matlab计算引擎服务,充分利用网络上的计算资源。3)matlab的计算引擎应用简单、灵活。但是惟一的缺点:就是c语言或者fortran语言开发的应用程序无法脱离ma tlab环境,所以使得应用计算引擎必须安装一套matlab。 第7章 matlab外部接口概述 3. c3. c语言或者语言或者fortranfortran语言应用程序读写语言应用程序读写matmat数据文件数据文件mat数据文件是matlab独有的一种数据文件格式,这种数据文件是一种二进制文件,能够跨平台
9、使用。mat数据文件的后缀名称是.mat。一般地,mat数据文件都是在matlab环境中进行读写的,不过可以利用matlab提供的函数库完成: c语言或者fortran语言读写mat数据文件的程序开发,这样就能够充分利用mat数据文件跨平台应用的优势了。 第7章 matlab外部接口概述 4. 4. 在在m m语言中调用语言中调用javajava类类 matlab的java接口包括: 1)调用java api类(class)和包(package),完成java核心功能。 2) 调用第三方定义的java类(class)。 3)在matlab 环境下创建java对象。 4)使用java语法或mat
10、lab语法使用java对象的方法。 5) 在java对象和matlab之间交互数据。 第7章 matlab外部接口概述 5. 5. 在在matlabmatlab中加载动态链接库中加载动态链接库windows平台下的动态链接库包含了一组函数,这些函数可以被不同的应用程序来调用,这些文件就是共享库在windo ws平台下的实现,这些文件的扩展名为.dll。 在应用程序运行的时候,动态库被自动加载到内存中,利用库函数完成计算或者某些操作。 matlab提供了相应的接口函数,可以将通用的动态链接库加载到matlab环境中,这样在m语言程序中就可以直接调用动态链接库包含的函数了。 第7章 matlab外
11、部接口概述 注意:注意:在matlab中加载动态链接库是matlab 6.5.1版新增加的功能, matlab早期的版本还不具备这些能力。如果需要在matlab 6.5版本中实现加载动态链接库的功能,则需要在mathworks公司的网站上下载一个补丁文件,该文件的超链接如下:ftp:/ /s33513/genericdll_1p1.exe 将该文件下载并安装后,就可以在matlab 6.5中实现该功能了。 第7章 matlab外部接口概述 6. matlab6. matlab的的comcom应用应用windows 平台上的matlab可以完成com客户端或者服务器应用程序的开发,尽管matla
12、b的com应用也是外部接口的内容,但是由于com应用相对难度较大,涉及的软件工具种类多,所以关于com应用的内容在matlab应用程序集成与发布一书中详细讲述。 同样有关动态数据交换(dde)的内容也在matlab应用程序集成与发布一书中详细讲述。 在上述各种外部接口应用中,最重要也是最常用的就是mex文件,所以在本课程中,将重点讲解mex文件的混合编程方法。 第7章 matlab外部接口概述 7.2 mxarray 数数 据据 结结 构构 1 1)matlab 是以矩阵为基本单位的。 2 2)与c语言不同,在c语言中,只有基本的双精度、整数、字符类型的变量定义,与matlab中的相应类型变量
13、定义是不一样。 3 3)为了能够在c语言中表示matlab的数据,matlab提供了一个特殊的c语言结构mxarray。 4)这结构就是用来在c语言中表示matlab数据的,在matlab的c语言外部接口编程中将大量使用该结构。第7章 matlab外部接口概述 7.2 mxarray 数数 据据 结结 构构 7.2.1 mxarray7.2.1 mxarray的定义的定义mxarray本身是一个c语言的结构(实现在c语言中表示matlab的数据),该结构的定义在matrix.h文件中,它的定义如下:struct mxarray_tag void *reserved; int reserved1
14、2; void *reserved2; int number_of_dims;第7章 matlab外部接口概述 unsigned int reserved3;struct unsigned 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 pri
15、vate_data_flag : 1; unsigned int flag8 : 1; 第7章 matlab外部接口概述 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 void *pdata; void *pimag_data; void *reserved5; 第7章 matlab外部接口概述 int r
16、eserved63; number_array; data; 第7章 matlab外部接口概述 mxarray结构由很多个字段组成,这些字段完成了记录matlab数据的工作。一般地,mxarray在记录一个数据时,需要保存下列信息: 数据类型。 数组维数。 与数组相关的数据(尺寸和数据)。 如果是数值对象,则保存数据对象是实数还是虚数。 如果是稀疏矩阵,则保存矩阵中非零元素的个数和索引。 如果是结构和对象,则保存字段的数量和相应的名称。 第7章 matlab外部接口概述 图7-1 mxarray保存双精度矩阵 第7章 matlab外部接口概述 从图7-1可以看出,mxarray将matlab数
17、据的信息分别保存在不同的字段里; 例如m和n分别表示二维矩阵的行数和列数;对于多维数组,m是矩阵的行数,而n是数组中每一个矩阵的列数、页面数和其它数据的乘积。维数保存着数据对象实际的维数。 而size字段存储着每个维存储数据元素的个数。 pr为实部数据的指针,pi是虚部数据的指针,如果没有虚部数据,则pi为null。 但是,在mxarray数据结构的定义中是不能直接找到这些字段的对应关系的,如果需要操作该数据对象,则需要使用专门的函数。 第7章 matlab外部接口概述 一般的情况下,直接操作mxarray对象比较困难,而且在使用mxarray数据对象时,都必须使用mxarray数据类型的指针
18、来完成工作。 为了便于创建和访问mxarray数据对象,matlab提供了相应的函数,这些函数就是matlab提供的mx函数,该函数具有c语言的形式和fortran语言的形式,利用这些函数不需要直接对mxarray结构对象的字段进行赋值或者读取了。 关于c语言的mx函数创建数据对象的方法将在下一小节进行介绍,而详细的c语言和fortran语言mx函数的解释请参阅matlab的帮助文档。 第7章 matlab外部接口概述 在进行外部接口编程时,获取数据类型信息是经常需要的一种操作。在mxarray结构中同样也保存着这样的信息,这类信息是通过mxclassid的枚举类型变量来保存的,该枚举类型定义
19、如下: typedef enum mxunknown_class = 0,mxcell_class,mxstruct_class,mxlogical_class,mxchar_class,mxsparse_class,/* obsolete! do not use */ 第7章 matlab外部接口概述 mxdouble_class,mxsingle_class,mxint8_class,mxuint8_class,mxint16_class,mxuint16_class,mxint32_class,mxuint32_class,mxint64_class,/* place holder -
20、future enhancements */ 第7章 matlab外部接口概述 mxuint64_class,/* place holder - future enhancements */mxfunction_class,mxopaque_class,mxobject_class mxclassid; 第7章 matlab外部接口概述 在mex文件中进行数据类型判断时,将返回mxclassid类型的变量。 此外,针对复数和实数也定义了一个枚举类型,该枚举类型的变量将在c语言应用程序中加以定义。它的定义如下:typedef enum mxreal, mxcomplex mxcomplexity
21、; 第7章 matlab外部接口概述 在c语言中创建mxarray数值类型对象需要指定数据是复数类型还是实数类型。为了能够保存字符串类型的变量,在matrix.h文件中还专门定义了相应的数据类型mxchar。mxchar 是 mxarray存储字符类型数据时使用的变量类型,该数据类型使用了16位的无符号整数,定义如下:typedef uint16_t mxchar;这里unit16_t是matlab自定义的数据类型符号,相当于c语言中unsigned int的定义。 第7章 matlab外部接口概述 为了便于用户学习外部接口编程,matlab也提供了相应的示例。 在windows平台下,这些示
22、例都保存在matlabroot extern examples目录中,在mex子目录下都是相应的mex函数文件例子, 其中有一个实例文件名为explore.dll,它是一个c语言的mex函数文件,功能是显示matlab数据对象的维数、尺寸和类型信息,将该文件拷贝到当前的工作路径下,然后在matlab中运行下面的指令: 第7章 matlab外部接口概述 x = 3; explore(x)-name: prhs0dimensions: 1x1class name: double-(1,1) = 3 第7章 matlab外部接口概述 在自己的matlab中运行下面的指令: explore (1 2
23、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章 matlab外部接口概述 7.2.2 7.2.2 外部接口函数外部接口函数前一小节曾经提及为了完成创建、访问mxarray数据对象的操作,matlab提供了相应的函数,这些函数是mx函数。 mx函数是matl
24、ab外部接口函数的一种,针对不同外部接口应用,matlab提供了不同类型的函数,其中mx是这些函数共有的前缀。 在表7-2中对c语言和fortran语言外部接口应用程序中常用的函数进行了分类总结。 第7章 matlab外部接口概述 表表7-2 matlab外部接口函数类型外部接口函数类型 函数类型 说 明 mat 函数 在 c 语言或者 fortran 语言应用程序中完成 mat 文件读写的函数,此类函数具有 mat 前缀 引擎函数 在c语言或者fortran语言应用程序中完成引擎操作的函数, 此类函数具有eng前缀 mex函数 在 c 语言或者 fortran 语言 mex 函数源文件中完成
25、系统操作的函数,此类函数具有 mex前缀 mx函数 在各种c语言或者fortran语言外部接口函数中用来操作 mxarray 数据对象的函数,此类函数具有 mx前缀 第7章 matlab外部接口概述 7.3 mx 函函 数数 应应 用用 7.3.1 7.3.1 数值矩阵数值矩阵matlab中基本的数据类型有两种,一种是双精度数据,另外一种是字符串,其中双精度数据可以是标量、向量或者矩阵,也可以是多维的数组。 matlab都将其看作矩阵或者数组,又由于这些数组或者矩阵的元素都是数字,因此又将其称之为数值矩阵或者数值数组。本小节将介绍外部接口编程中通过mx函数创建使用数值矩阵的方法。 第7章 ma
26、tlab外部接口概述 1. 1. 标量标量所谓标量,就是具有一个元素的矩阵,也就是11的矩阵。利用mx函数创建标量的方法非常简单,只需要用函数mxcreatedoublescalar就可以了,该函数的c语言定义如下:mxarray *mxcreatedoublescalar(double value);函数的输入参数是双精度类型的数据,可以是常量或者变量,而输出参数是mxarray数据结构的对象。使用该函数的方法参见下面的代码片段: 第7章 matlab外部接口概述 double realdata = 1.0;mxarray *data;/* 创建mxarray数据对象- 双精度标量 */da
27、ta = mxcreatedoublescalar(realdata); 见data.c第7章 matlab外部接口概述 2. 2. 向量和矩阵向量和矩阵由于在c语言中向量和矩阵都可以看作为二维数组,不过向量是1n或者n1的二维数组(矩阵),所以在c语言中创建向量和矩阵都是使用同一个函数。创建双精度类型矩阵可以使用mxcreatedoublematrix函数,该函数的定义如下:mxarray *mxcreatedoublematrix(int m, int n, mxcomplexity complexflag); 第7章 matlab外部接口概述 该函数的输入参数是: 矩阵的行数m和列数n;
28、 以及数据是复数或者实数的标志。 该函数若成功执行,则返回变量为mxarray数据结构的对象指针。若不能成功执行,则在独立可执行应用程序中返回null,在mex函数中返回matlab命令行窗口。 通过该函数创建的双精度类型矩阵还没有实际的元素,而矩阵具体的元素的创建还需要通过另外的操作才能完成。创建双精度类型矩阵的完整过程参阅下面的代码片段: 第7章 matlab外部接口概述 double realdata=1,2,3,4,imagdata=1,2,3,4; double *pr, *pi; mxarray *data; /int flag;/ /* 创建mxarray数据对象- 22复数矩阵
29、 */ data = mxcreatedoublematrix(2,2,mxcomplex); /*获取双精度类型矩阵的实部和虚部数据指针*/ pr = mxgetpr(data); pi = mxgetpi(data); /*复制数据完成赋值*/ memcpy(pr,realdata,4*sizeof(double); memcpy(pi,imagdata,4*sizeof(double); 见data1.c第7章 matlab外部接口概述 在上面的代码片段中完成了双精度类型矩阵的创建, 其中使用mxgetpr函数和mxgetpi函数获取了矩阵实部和虚部的指针, 然后通过memcpy函数通过
30、复制内存数据的方法完成整个矩阵数据的赋值。上述mxarray数据类型对象创建的过程完整地说明了在c语言中创建matlab数据对象的完整过程: 首先使用mx函数创建指针完成mxarray数据类型指针的内存分配; 然后通过mxgetpr和mxgetpi函数获取mxarray数据类型的实部数据指针和虚部数据指针; 最后是用内存复制的方法完成数据的赋值。 而操作mxarray类型数据指针的过程是通过mxgetpr和mxgetpi函数获取mxarray数据对象的指针,然后通过内存复制的方法将具体的数据赋值给相应的c语言双精度类型变量。 第7章 matlab外部接口概述 3. 3. 任意数值数组任意数值数
31、组众所周知,除了双精度类型,matlab还支持整数类型、单精度类型等其它数值类型,也可以创建三维甚至更多维的数组。在外部接口应用中,通过不同函数可以完成同样的操作。如果需要创建任意类型数据的矩阵可以使用mxcreatenume ricmatrix函数,该函数的定义如下:mxarray *mxcreatenumericmatrix(int m, int n, mxclassid class, mxcomplexity complexflag);该函数的输入参数是: 矩阵的行数m和列数n、矩阵的数据类型class以及实数或者复数的标志。第7章 matlab外部接口概述 下面的代码片段说明了创建32
32、位整数类型复数矩阵的方法: /* 实部数据和虚部数据 */ long realdata = 1,2;long imagdata = 1,2;/* 实部虚部数据的指针 */long *pr,*pi; mxarray *data; /* 创建mxarray数据对象- 双精度标量 */ data = mxcreatenumericmatrix(1,2,mxint32_class,mxcomplex); /* 获取实部数据和虚部数据的指针 */ 第7章 matlab外部接口概述 pr = mxgetpr(data);pi = mxgetpi(data);/* 通过内存复制的方法完成赋值 */memcp
33、y(pr,realdata,2*sizeof(long);memcpy(pi,imagdata,2*sizeof(long); 见data2.c第7章 matlab外部接口概述 上述代码片段创建的数据为ans = 1.0000 + 1.0000i 2.0000 + 2.0000i其数据类型为name size bytes class ans 1x2 16 int32 array (complex)grand total is 2 elements using 16 bytes 第7章 matlab外部接口概述 如果需要创建任意类型数据的多维数组可以使用mxcreatenumericarray函
34、数,该函数的定义如下:mxarray *mxcreatenumericarray(int ndim, const int *dims, mxclassid class, mxcomplexity complexflag);该函数的输入参数分别为: 数组的维数ndim、每一维的尺寸*dims、数组的数据类型class以及实数或者复数的标志。 其中每一维的尺寸需要保存在一个数组中ndims,返回的参数为mxarray数据类型的指针。 第7章 matlab外部接口概述 使用mxcreatenumericarray函数创建多维数组的过程参见下面的代码片段: /* 数组的实际数据 */ double r
35、ealdata = 0,1,2,3,4,5,6,7,8,9,10,11; /* 多维数组的每一维尺寸 */int ndims = 2,2,3;double *pr; mxarray *data; /* 创建mxarray数据对象- 双精度三维数组 */ data = mxcreatenumericarray(3,ndims,mxdouble_class,mxreal); /* 获取数组的实部数据指针 */ 第7章 matlab外部接口概述 pr = mxgetpr(data); /* 通过内存赋值的方法完成数据的赋值 */ memcpy(pr,realdata,12*sizeof(double
36、);上述代码片段创建的多维数组是ans(:,:,1) = 0 2 1 3ans(:,:,2) = 4 6 5 7ans(:,:,3) = 8 10 9 11 见data3.c第7章 matlab外部接口概述 这里主要需要说明: c语言中数组的序列是以行元素优先的,而matlab的数组是以列元素优先的,所以在上述代码创建的数组中,realdata数组数据出现在matlab的顺序为列元素排列。 另外,c语言数组的起始元素序号为0,而matlab数组元素起始序号为1。在创建多维数据的时候需要注意,当数组数据的个数不满足实际多维数组的个数时,不足的数据将自动使用数据0来初始化。 第7章 matlab外
37、部接口概述 7.3.2 7.3.2 字符串字符串matlab另外一种的基本数据类型就是字符串类型。同c语言不同的是,matlab中只有字符串一种数据类型来表示文本信息,而c语言中有字符类型和字符串类型两种不同的数据表示文本信息。在外部接口应用程序中创建mxarray数据类型对象表示字符串数据可以通过不同的函数来完成,其中,将c语言的字符串转变为matlab字符串最简单的函数是mxcreatestring函数,它的定义如下:mxarray *mxcreatestring(const char *str); 第7章 matlab外部接口概述 1 ) 该函数的输入参数是字符串的内容,输入参数是c语言
38、的字符串常量,而输出参数就是mxarray数据类型的对象,该对象就是matlab的字符串。 使用mxcreatestring函数创建字符串的方法参见下面的代码片段: mxarray *data; /* 创建mxarray数据对象- 字符串 */ data = mxcreatestring(isnt matlab great?); 见data4.c第7章 matlab外部接口概述 2)matlab 还提供其他函数创建字符数组(向量、矩阵或多维数组) mxarray *mxcreatechararray(int ndim,const int *dims); 函数输入参数: 数组维数ndim, 每一
39、维的尺寸*dims ; 数组数据通过mx内存复制。unsigned short data=65,66,67,68,69,70,71,72,73,74,75,76; int ndims=2,2,3; unsigned short *pr ; 第7章 matlab外部接口概述 /* 创建mxarray 数据对象-字符类型多维数组*/ data=mxcreatechararray(3,ndims);/*获取数据指针*/ pr=mxgetpr(data);/*通过内存赋值的方法完成数据赋值*/ mempcy(pr,data,12*sizeof(short);结果:ans(:,:,1)acbdans(:
40、,:,2)egfhans(:,:,3)ikjl 见data5.c第7章 matlab外部接口概述 注意:在matlab中每个字符数组元素占用两个字节的内存空间,所以在c语言代码中,使用unsigned short类型的数据为字符数组进行赋值。数组元素的顺序是以列元素优先的。3 ) 如 果 创 建 字 符 串 矩 阵 , 还 可 以 使 用 函 数mxcreatechar matrixformstring,该函数可以用来创建二维的字符串矩阵,它的定义如下:mxarray *mxcreatecharmatrixfromstrings(int m, const char *str);第7章 matl
41、ab外部接口概述 该函数的输入参数: 字符串矩阵的行数以及矩阵中的内容,该函数能够自动判断输入的字符串内容的长度,并且使用所有字符串中最长的长度来分配matlab字符串占用的内存。 该函数创建字符串矩阵的方法参考下面的代码片段: /*字符串矩阵的内容*/ char *string = matlab,外部接口,编程; mxarray *data; /* 创建mxarray数据对象- 字符串矩阵 */ data = mxcreatecharmatrixfromstrings(3,string); 第7章 matlab外部接口概述 上述代码片段创建的字符串矩阵为 ans =matlab外部接口 编程
42、 whos name size bytes class ans 3x6 36 char array见data6.c 第7章 matlab外部接口概述 7.3.3 7.3.3 逻辑数组逻辑数组逻辑数组在matlab中是一类特殊的数据类型,一般进行任何关系运算得到的结果就是逻辑类型的数据。 在其它的高级语言中,一般将这种数据称之为布尔类型变量,这种变量只有两种可能的取值。 在matlab中,用1代表逻辑真,用0表示逻辑假。逻辑数组每一个元素占用一个字节的内存。外部接口应用程序同样提供了不同的函数来创建逻辑数组。和创建数值矩阵类似,逻辑数组也分为创建标量、矩阵和多维数组的函数。 第7章 matlab
43、外部接口概述 )创建逻辑类型的标量需要使用的函数定义如下:mxarray *mxcreatelogicalscalar(mxlogical value);该函数输入参数的类型为mxlogical;这种数据类型就是c语言中表示布尔类型的数据类型,一般为bool。函数的输出参数是mxarray数据类型的对象,表示逻辑量。 ) 如 果 创 建 逻 辑 类 型 的 矩 阵 , 则 需 要 使 用 函 数mxcreatelogicalmatrix,该函数的定义如下:mxarray *mxcreatelogicalmatrix(int m, int n); 第7章 matlab外部接口概述 该函数的输入参
44、数是逻辑矩阵的行数m和列数n,函数的输出参数是mxarray数据类型的对象,它表示逻辑量矩阵。如果创建逻辑类型的多维数组,则可以使用函数mxcreatelogicalarray,该函数的定义如下:mxarray *mxcreatelogicalarray(int ndim, const int *dims);该函数的输入参数:数组的维数ndim;每一维的尺寸*dims函数的输出参数:mxarray数据类型的对象,它表示逻辑数组。 第7章 matlab外部接口概述 下面的代码片段说明了使用mxcreatelogicalarray函数创建逻辑数组的过程: /*逻辑数组的数据*/ bool data
45、 = 0,1,0,1,0,1,0,1,0,1,0,1; /*数组的尺寸*/int ndims = 3,4; /*数据的指针*/mxlogical *pr; mxarray *data; /* 创建mxarray数据对象- 逻辑类型数组 */ data = mxcreatelogicalarray(2,ndims); 第7章 matlab外部接口概述 /*获取数据的指针*/ pr = mxgetlogicals(data); /* 通过内存赋值的方法完成数据的赋值 */ memcpy(pr,data,12*sizeof(mxlogical);)在创建逻辑数组时,不能使用mxgetpr函数来获取数
46、据的指针,而是使用mxgetlogicals函数获取逻辑数组数据的指针,该函数的定义如下:mxlogical *mxgetlogicals(const mxarray *array_ptr); 函数的输入参数是表示逻辑数组的mxarray数据类型对象,返回的输出参数是mxlogical类型的数据指针,为mxarray数据类型对象中所包含的数据首地址。 第7章 matlab外部接口概述 上述代码片段得到的逻辑类型矩阵如下:ans = 0 1 0 1 1 0 1 0 0 1 0 1 whos name size bytes class ans 3x4 12 logical arraygrand t
47、otal is 12 elements using 12 bytes 见data7.c 第7章 matlab外部接口概述 在matlab中存在大量的以is为前缀的函数,这些函数主要是完成逻辑判断操作的函数,函数返回的变量类型也是逻辑类型数组。 在外部接口编程中同样也存在相应的函数可以完成逻辑判断操作。 这些函数就是以mxis为前缀的mx函数,这些函数多数是用来完成数据类型的判断,但是返回的变量不是逻辑类型的mxarray数据对象,而是bool类型的数据,也就是mxlogical类型的数据。 第7章 matlab外部接口概述 7.3.4 7.3.4 元胞数组元胞数组元胞数组是matlab特有的一
48、种数据类型,用户可以将元胞数组看作成为广义矩阵。组成元胞数组的元素可以是各种类型的matlab数据,既可以是标量、向量,也可以是矩阵甚至是多维数组。在外部接口应用程序中,通过mx函数创建元胞数组的过程比创建普通的数据要略微繁琐:第7章 matlab外部接口概述 首先,创建元胞数组的各个元胞数据;然后,创建元胞类型的数据对象指针;最后,将元胞数据赋值给元胞数组的各个元素。创建其它类型数据的函数在其它小节都已经介绍了,而创建元胞数组的函数有两个,分别用来创建元胞类型的矩阵和元胞类型的数组。 第7章 matlab外部接口概述 )创建元胞类型矩阵函数定义如下:mxarray *mxcreatecell
49、matrix(int m, int n);该函数的输入参数:矩阵的行数m和列数n;返回的输出参数:元胞矩阵的mxarray数据类型对象指针。第7章 matlab外部接口概述 )创建元胞类型数组函数定义如下:mxarray *mxcreatechararray(int ndim, const int *dims);该函数的输入参数:数组的维数ndim;每一维的尺寸*dims。返回的输出参数:元胞数组的mxarray数据类型对象指针。 第7章 matlab外部接口概述 3)创建了元胞数组的mxarray数据类型对象指针后,需要使用mxsetcell函数将已经创建好的元胞数据赋值给具体的元胞数组。
50、mxsetcell函数的定义如下:void mxsetcell(mxarray *array_ptr, int index, mxarray *value);该函数没有返回的输出参数。 输入参数:分别为元胞数组的mxarray数据类型对象指针array_ptr;元胞元素的索引index;元胞数据的mxarray数据类型对象指针value。第7章 matlab外部接口概述 下面的代码片段说明了创建元胞数组的过程: /* 元胞数组的指针 */ mxarray *data; /*实际数据的指针 */ mxarray *string; mxarray *multi; mxarray *scalar;
51、int ndims = 2,2,2; double realdata = 1,2,3,4,5,6,7,8; double *pr; 第7章 matlab外部接口概述 /*创建字符串类型变量*/ string = mxcreatestring(isnt matlab great?);/*创建多维数值数组*/ multi = mxcreatenumericarray(3,ndims,mxdouble_class,mxreal); pr = mxgetpr(multi); memcpy(pr,realdata,8*sizeof(double); /*创建标量*/scalar = mxcreatedo
52、ublescalar(10); /*创建元胞数组*/data = mxcreatecellmatrix(1,3);/*使用mxsetcell函数设置元胞的数据*/ mxsetcell(data,0,string);mxsetcell(data,1,multi);mxsetcell(data,2,scalar); 第7章 matlab外部接口概述 上述代码片段创建的元胞数组为 见data8.c ans = isnt matlab great? 2x2x2 double 10 whos name size bytes class ans 1x3 290 cell arraygrand total
53、is 31 elements using 290 bytes 需要注意: 在c语言中数组的起始元素序号为0,所以,使用mxsetcell函数设置元胞数组数据的时候,第一个元胞数据应该用数字0作为序号。 第7章 matlab外部接口概述 7.3.5 7.3.5 结构数组结构数组结构类型的数据和元胞类型的数据非常类似,在matlab中还有专门的函数完成两者之间的转换。 结构类型的数据是由若干记录组成的; 每一个记录保存在结构的字段中; 结构保存的数据可以是任意类型的matlab数据。第7章 matlab外部接口概述 在外部接口应用程序中,创建结构数组的过程和创建元胞数组的过程也非常类似,基本过程如
54、下:首先,准备不同字段的数据。其次,创建结构类型的数据对象指针。最后,使用mx函数完成结构数据的赋值。 第7章 matlab外部接口概述 1) 创建结构类型矩阵 函数定义如下:mxarray *mxcreatestructmatrix(int m, int n, int nfields, const char *field_names);结构矩阵的函数输入参数比较多: 矩阵的行数m和列数n,字段的个数nfields,字段名称的字符串数组field_names。 结构矩阵函数的输出参数:mxarray数据类型的数据对象指针表示一个结构矩阵。 第7章 matlab外部接口概述 2)创建结构类型数组
55、 函数定义如下:mxarray *mxcreatestructarray(int ndim, const int *dims, int nfields,const char *field_names);创建结构数组函数的输入参数: 分别为数组的维数ndim,数组每一维的尺寸*dims,字段的个数nfileds,字段名称的字符串数组field_names。 函数的输出参数: mxarray数据类型的数据对象指针,表示一个结构类型的数组。 第7章 matlab外部接口概述 /* 结构类型数据的指针 */ mxarray *data;/* 结构中实际数据对象 */ mxarray *string;
56、mxarray *scalar; int field_num = 0;/* 字段名称 */ char fields =string,scalar;/*创建结构的数据 */ string = mxcreatestring(isnt matlab great?); scalar = mxcreatedoublescalar(10); 第7章 matlab外部接口概述 /* 创建结构矩阵 */data = mxcreatestructmatrix(1,1,2,fields); /*设置结构的字段数据 */field_num = mxgetfieldnumber(data, fields0); /*返
57、回域名的索引值,即结构体的字段序号*/mxsetfieldbynumber(data,0, field_num, string);/*设置结构的字段数据 */field_num = mxgetfieldnumber(data, fields1);mxsetfieldbynumber(data,0, field_num, scalar); 第7章 matlab外部接口概述 上述代码创建的结构矩阵如下: 见data9.c ans = string: isnt matlab great? scalar: 10 在上面的代码片段中注: 首先,使用mxgetfieldnumber函数获取字段序号, 然后
58、,利用mxsetfiledbynumber函数设置不同字段数据。 mxsetfield(data, 0, fields0,string); /*设置字段的数值*/ mxsetfield(data, 0, fields1,scalar); /*设置字段的数值*/ 第7章 matlab外部接口概述 注意(续): 函数的第二个参数是整个结构数组的元素序号,所以在上面的代码片段中,这个参数都被设置成为0,表示结构数组的第一个元素。 第7章 matlab外部接口概述 7.3.6 7.3.6 稀疏矩阵稀疏矩阵稀疏矩阵是一类特殊的数值矩阵,这些矩阵中多数数据都是0,只有一小部分的元素为非零数据。 在一般情况
59、下,矩阵中的零元素没有什么特殊意义,但是,如果编程中使用矩阵的完整表示,则这些零元素将会占用很多内存空间,所以,在数据结构上提出了保存稀疏矩阵的算法,做到既能够有效地完成稀疏矩阵的存储和运算,又能够达到节约内存空间的目的。 第7章 matlab外部接口概述 在matlab中保存稀疏矩阵是通过以下三个数组来完成的:1) 第一个数组保存所有的非零元素,一般该数组为双精度类型,数组的长度为nzmax。2)第二个数组为整数类型数组,保存每个非零元素的行序号索引。3)第三个数组是长度为n+1的整数类型数组,其中n为矩阵的列数。该数组保存非零元素的列索引信息。该数组最后一个元素是稀疏矩阵的非零元素个数。有
60、关稀疏矩阵的存储算法可以参阅有关的数据结构数据或者matlab的帮助文档。 第7章 matlab外部接口概述 1) 在外部接口程序中,可以使用不同的函数创建不同数据类型的稀疏矩阵,其中最常用的就是创建双精度类型的稀疏矩阵,其函数为mxcreatesparse定义如下:mxarray *mxcreatesparse(int m, int n, int nzmax,mxcomplexity complexflag);该函数的输入参数分别为: 矩阵的行数m和列数n,矩阵中非零元素的个数nzmax,以及矩阵数据的复数或者实数标志。 函数的输出参数:稀疏矩阵的mxarray数据类型指针。 第7章 mat
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 山东省滨州市惠民县2024-2025学年九年级上学期期末化学试题(含答案)
- 辽宁省鞍山市2024-2025学年高一上学期期末物理试卷(含答案)
- 绿色营销的评价体系讲义
- (一模)哈三中2025届高三第一次模拟考试 地理试题(含答案)
- 中小学消防知识培训课件
- 企业员工培训体系构建与实践经验分享
- 形容词级与最高级的用法对比高一英语教学设计
- 物联网智能家居解决方案合同
- 三只小猪盖房记读后感
- 企业数据安全保护服务协议
- 安徽交通职业技术学院单招《职业技能测试》参考试题库(含答案)
- 银行国内保理业务操作规程
- 二级公立医院绩效考核三级手术目录(2020版)
- 有创动脉血压监测护理查房课件
- 宋朝服饰介绍分享
- 小波分析及其MATLAB实现
- 2021中国静脉血栓栓塞症防治抗凝药物的选用与药学监护指南(2021版)解读
- 拇指骨折护理查房
- 职业院校技能大赛(健身指导赛项)备考试题库(含答案)
- 牙周检查记录表
- GB/T 10060-2023电梯安装验收规范
评论
0/150
提交评论