MATLAB外部程序接口应用.pdf





《MATLAB外部程序接口应用.pdf》由会员分享,可在线阅读,更多相关《MATLAB外部程序接口应用.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 第 10 章 MATLAB 外部程序接口应用 10.1 MATLAB 数据接口 MATLAB 语言和其他程序设计语言一样,程序运行中的所有变量都保存在称为工作区的内存中,这些变量可以在程序中直接引用。但是工作区的大小是有限的,如果处理的数据较大,就需要和磁盘文件中的数据进行交换。有时要从外部设备中输入数据,有时要把程序处理过的数据输出到外部设备中。MATLAB 提供了多种不同层次的数据输入/输出函数。10.1.1 通用文件 I/O 操作 MATLAB 支持某些特定格式和类型的数据文件(如图形文件、音频/视频文件、电子表格等)的读写操作,将该类文件中的数据导入到 MATLAB 的工作区,最简单
2、的办法是使用数据导入向导(可通过选择 File 菜单项中的 Import data 命令或在命令窗口执行命令 uiimport 来激活它),而在 M 文件中则可以使用 MATLAB 输入/输出函数。1文本数据的输入 在前面介绍过的 load 和 save 函数是 MATLAB 中为装载和存储数据提供的工具,但 load 函数只能读取以 ASCII 形式存储的,每一行数据为固定长度的文件。如果一个文件中的数据全部由 ASCII 字符组成,且数据间有间隔符(如空格、逗号、分号、制表位),则文件称为有格式文件。有格式文件可以使用文本输入函数读取数据,其调用格式为:A,B,C,=textread(fi
3、lename,format,N,param,value)其中,A、B、C 是用于存放读取数据的向量,filename 为待操作的文件,format 用以控制读取的数据格式,由%加上格式符组成,常见的格式符如表 10-1 所示。N 指定重复使用该格式的次数,param 指定一些特殊操作,value 是与特殊操作有关的值,例如,跳过两行标题行可将headerlines参数设为 2。表 10-1 数据格式描述符 格 式 符 含 义 格 式 符 含 义%d 有符号的十进制整数%e 指数形式的实数%u 无符号的十进制整数%f 小数形式的实数%s 字符串%c 字符 在%之后还可以加上数据宽度,例如%3d,
4、它控制读取的整型数据取 3 位数字;%10.3f 控制读取实型数据取 10 个字符(含小数点),小数部分占 3 位。【例 10-1】假定文件 textdemo.txt 中有以下格式的数据:Name English Chinese Mathmatics Wang 99 98 100 Li 85 77 91 PDF created with pdfFactory Pro trial version MATLAB 程序设计与典型应用 296 Zhang 88 61 84 Zhao 78 52 100 此文件第一行为标题行,第二行至第五行的第一列为字符型,后三列为整型。从该文件中读取数据的命令如下:n
5、ame,x,y,z=textread(textdemo.txt,%s%d%d%d,4,headerlines,1)2多媒体文件的读写 MATLAB 除对文本数据进行操作外,还可以对图像文件、WAV 类型的音频文件和 AVI 类型的视频文件进行读写。下面介绍对音频文件和视频文件进行读写的函数。(1)info=mmfileinfo(filename):查询音频或视频文件信息。(2)y=wavread(filename):读取 WAV 格式的音频文件。(3)y=aviread(filename):读取 AVI 格式的视频文件。(4)wavwrite(y,filename):以 WAV 格式输出音频文
6、件。(5)aviobj=avifile(y,filename):将 MATLAB 的图像序列生成 AVI 格式的视频,建立 AVI文件的句柄存放于 aviobj 中。10.1.2 低级文件 I/O 操作 对于其他非通用格式文件的读写,可以采用 MATLAB 提供的低级文件 I/O 函数。因为这些函数是基于 ANSI 标准 C 语言库实现的,所以两者的格式和用法有许多相似之处。1文件打开与关闭 对一个文件进行操作以前,必须先打开该文件,系统将为其分配一个输入/输出缓冲区。当文件操作结束后,还应关闭文件,及时释放缓冲区。(1)fopen 函数 fopen 函数用于打开文件以供读写,调用格式参看示例
7、。(2)fclose 函数 fclose 函数用于关闭已打开的文件,调用格式参看示例。2文本文件的读写(1)fscanf 函数 fscanf 函数用于读取文本文件的内容,并按指定格式存入矩阵。调用格式参看联机帮助文档。(2)fprintf 函数 fprintf 函数可以将数据按指定格式写入到文本文件中。调用格式参看示例。【例 10-2】计算当=x0.0,0.1,0.2,1.0时,()exf x=的值,并将结果写入文件demol.txt。代码如下:x=0:0.1:1;y=x;exp(x);fid=fopen(demo1.txt,w);fprintf(fid,%6.2f%12.8fn,y);fcl
8、ose(fid);上述程序段中%6.2f 控制 x 的值占 6 位,其中小数部分占 2 位。同样,%12.8f 控制指数函数 exp(x)的输出格式。由于是文本文件,可以在 MATLAB 命令窗口用 type 命令显示其内容:PDF created with pdfFactory Pro trial version 297 第 10 章 MATLAB 外部程序接口应用 type demo1.txt 0.00 1.00000000 0.10 1.10517092 0.20 1.22140276 0.30 1.34985881 0.40 1.49182470 0.50 1.64872127 0.6
9、0 1.82211880 0.70 2.01375271 0.80 2.22554093 0.90 2.45960311 1.00 2.71828183 从此例可以看出,尽管 fprintf 的命令格式与 C 语言中的类似,但有一个主要的区别,即这里变量名只有一个 y,而输出的是 11 行数据,所以说 MATLAB 中的 fprintf 是矢量式的输出。此外,可以利用 fprintf 函数实现数的类型转换。【例 10-3】将十进制数转换为十六进制数。代码如下:a=2 12 14 20 35;fprintf(%9Xn,a+(a fid=fopen(demo1.txt,r);while 1 LI=
10、fgetl(fid);if LI fid=fopen(magic5.dat,r);B,ct=fread(fid,5,inf,int32)fclose(fid);运行代码输出为:B=17 24 1 8 15 PDF created with pdfFactory Pro trial version 299 第 10 章 MATLAB 外部程序接口应用 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 ct=25 4数据文件定位 当打开文件并进行数据的读写时,需要判断和控制文件的读写位置,例如判断文件数据是否已读完,或者需要读写指定位置上的数
11、据等。MATLAB 自动创建一个文件位置指针来管理和维护读写文件数据的起始位置。(1)fseek 函数 用于定位文件位置指针,其调用格式参看示例。(2)ftell 函数 用来查询文件指针的当前位置,其调用格式参看示例。【例 10-7】下列程序执行后,变量 four、position 和 three 的值是多少?代码如下:a=1:5;fid=fopen(fdat.bin,w);%以写方式打开文件 fdat.bin fwrite(fid,a,int16);%将 a 的元素以双字节整型写入文件 fdat.bin status=fclose(fid);fid=fopen(fdat.bin,r);%以读
12、数据方式打开文件 fdat.bin status=fseek(fid,6,bof);%将文件指针从开始位置向尾部移动 6 个字节 four=fread(fid,1,int16)%读取第 4 个数据,并移动指针到下一个数据 position=ftell(fid)%ftell 的返回值为 8 status=fseek(fid,-4,cof);%将文件指针从当前位置往前移动 4 个字节 three=fread(fid,1,int16)%读取第 3 个数据 status=fclose(fid);运行程序输出为:four=4 position=8 three=3(3)feof 函数 用来判断当前的文件位
13、置指针是否到达文件尾部,调用格式为:status=feod(fid)测试结果返回 1 表示当前文件位置指针指向末尾,返回 0 表示没有指向末尾。(4)ferror 函数 用来查询最近一次输入或输出操作中的出错信息,其调用格式为:message,errnum=ferror(fid)其中 message 返回出错信息,errnum返回错误编号。PDF created with pdfFactory Pro trial version MATLAB 程序设计与典型应用 300 10.1.3 MAT 文件及其应用 MAT 文件是 MATLAB 数据存储的默认文件格式,以双精度二进制格式保存数据。MAT
14、 文件为在不同平台或不同应用程序间移动数据提供了一种很方便的机制。1MAT 文件 MAT 文件由 128 字节的 MAT 文件头和其后的数据单元组成。文件头包括 MATLAB 版本、数据和文件被创建的时间等信息。数据单元分为标志和数据两个部分,标志占 8 字节,包含数据类型、数据大小等信息。如果标志中的数据字节数小于 4,那么,MATLAB 使用压缩格式存储单元中的数据。MATLAB 的 save 命令可以将 MATLAB 系统内部数据保存为 MAT 文件,而 load 命令可以将磁盘上的 MAT 文件中的数据读入到 MATLAB 系统中。此外,为了有效地管理 MAT 文件,以及在 MATLA
15、B 外部读取和创建 MAT 文件,MATLAB 提供了一个子程序库,用户可以在C/C+、FORTRAN 程序中直接调用这些子程序来创建和读取 MAT 文件。MATLAB 提供的用于操作 MAT 文件的 API 函数封装于两个标准库文件中:libmat.lib 和libmx.lib。前者用于对 MAT 文件的操作,后者用于对 MAT 文件中矩阵的操作。这两个库文件对于不同语言和不同版本的编辑器而有所不同,存放在binwin32 相应子文件夹中。此外,在externinclude 中有与前面两个标准库文件对应的.def 文件:libmat.def、libmx.def。其导出函数的原型位于同一目录下
16、的 mat.h 和 matrix.h 中,mat.h 包含了 MAT 文件的创建、读写等函数的定义,matrix.h 包含了 MATLAB 中基本的数据类型、矩阵的定义和操作方法。2C 语言 MAT 文件 常用 MAT 文件操作函数如下。(1)打开 MAT 文件 MATFile*matOpen(const char*filename,const char*mode)其中 filename 为要操作的文件,mode 用来说明对文件的使用方式,可取以下值。l r:以只读方式打开文件。l u:以可读也可写的方式打开文件。l w:以只能写的方式打开文件。如果该文件中有内容,则删除原有内容。l wz:打
17、开文件用于写入压缩数据。(2)关闭 MAT 文件 int matClose(MATFile*mfp)其中 mfp 指向要操作的 MAT 文件,如果函数执行成功,返回 0,否则返回“EOF”。(3)向 MAT 文件中存入一个矩阵 int matPutVariable(MATFile*mfp,const char*name,const mxArray*mp)此函数将一个 mp 指向的 mxArray 结构体写入 mfp 所指向的 MAT 文件中。如果文件中存在同名的 mxArraay 结构体,那么将覆盖原来的值;如果不存在同名的 mxArray 结构体,则将此结构体添加到文件末尾。函数执行成功,返
18、回 0,否则返回一个非零值。(4)向 MAT 文件中存放一个矩阵 matPutArrayAsGlobal(MATFile*mfp,const mxArray*mp)执行此命令后,使用 load 命令装入这个 MAT 文件时,该矩阵对应的变量成为全局变量。PDF created with pdfFactory Pro trial version 301 第 10 章 MATLAB 外部程序接口应用(5)获取 MAT 文件中的变量列表 char*matGetDir(MATFile*mfp,const mxArray*mp)函数执行成功,mfp 返回一个字符指针数组,其中的每个元素指向 MAT 文件
19、中的一个矩阵;执行失败,mfp 返回一个空指针,num为-1。如果 num=0,则表示 MAT 文件中没有矩阵。(6)获取 MAT 文件的 C 语言 FILE 句柄 通过该句柄,用户可以使用 C 语言的库函数 feof、ferror 来判断错误原因。(7)从 MAT 文件中读取一个矩阵 mxArray*matGetVariable(MATFile*mfp,const char*name)如果函数执行成功,在内存中创建一个命名为 name 的 mxArray 类型结构体对象,并将读取的数据赋给该对象。matGetDir、matGetFp、matGetVariable 函数通过 mxCalloc
20、函数分配内存,在程序结束时,必须使用 mxFree 函数释放内存。(8)从 MAT 文件中删除一个矩阵 int matDeleteVariable(MATFile*mfp,const char*name)其中,name 为要删除的矩阵。如果函数执行成功,将返回 0,否则返回一个非零值。3应用示例【例 10-8】创建 MAT 文件。#include#include /*For strcmp()*/#include /*For EXIT _FAILURE,EXIT _SUCCESS*/#includemat.h#define BUFSIZE 256 inat main()MATFile*pmat;
21、/*定义 MAT 文件指针*/mxArray*pa1,*pa2,*pa3;double data9=1.0 4.0 7.0 2.0 5.0 8.0 3.0 6.0 9.0;const char*file=mattest.mat;char strBUFSIZE;int status;/*打开一个 MAT 文件,如果不存在,则创建一个 MAT 文件,如果打开失败,则返回*/printf(Creating file%s.nn,file);pmat=matOpen(file,w);if(pmat=NULL)printf(Error creating file%sn,file);printf(Do yo
22、u have write permission in this directory?)n);return(EXIT_FAILURE;)/*创建三个 mxArray结构体对象,其中 pa1、pa2 分别为 33、22 的双精度实型矩阵*/pa1=mxCreateDoubleMatrix(3,3,mxREAL);if(pa1=NULL)PDF created with pdfFactory Pro trial version MATLAB 程序设计与典型应用 302 printf(%s:Out of memory on line%dn,_FILE_,_LINE_);printf(Unable to
23、 create mxArray.n);return(EXIT_FAILURE);pa2=mxCreateDoubleMatrix(3,3,mxREAL);if(pa2=NULL)printf(%s:Out of memory on line%dn,_FILE_,_LINE_);printf(Unable to create mxArray.n);return(EXIT_FAILURE);memcpy(void*)(mxGetPr(pa2),(void*)data,sizeof(data);pa3=mxCreateString(MATLAB:the language of technical c
24、omputing);if(pa3=NULL)printf(%s:Out of memory on line%dn,_FILE_,_LINE_);printf(Unable to create string mxArray.n);return(EXIT_FAILURE);/*向 MAT 文件中写数据,失败则返回*/status=matPutVariable(pmat,LocalDouble,pal);if(status!=0)printf(%s:Error using matPutVariable on line%dn,_FILE_,_LINE_);return(EXIT_FAILURE);st
25、atus=matPutVariableAsGlobal(pmat,GlobalDouble,pa2);if(status!=0)printf(Error using matPutVariableAsGlobaln);return(EXIT_FAILURE);status=matPutVariable(pmat,LocalString,pa3);if(status!=0)printf(%s:Error using matPutVariable on line%dn,_FILE_,_LINE_);return(EXIT_FALURE);/*清除矩阵*/mxDestroyArray(pa1);mxD
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 外部 程序 接口 应用

限制150内