您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > Matlab教程Ch8(全)
1第8章高级编程技术2本章目标掌握MATLAB文件处理方法理解MATLAB应用程序接口的原理了解结构和元胞这两种复杂数据类型了解面向对象编程的基本概念3主要内容8.1文件8.2应用程序接口48.1文件文件可分为两类:文本文件由字符和与字符的显示格式有关的控制符构成常见扩展名:“TXT”、“BAT”、“HTM”二进制文件二进制文件为非文本文件常见扩展名:“COM”、“EXE”、“BMP”、“WAV”5MATLAB中基本的低级文件I/O指令:1.打开和关闭文件fopen、fclose2.格式读写fprintf、fscanf、fgetl、fgets3.非格式读写fread、fwrite4.文件定位和状态feof、fseek、ftell、ferror、frewind68.1.1文件的打开与关闭1.fopen函数fid=fopen(filename,permission)[fid,message]=fopen(filename,permssion)[filename,permission,machineformat]=fopen(fid)fid=fopen('all')2.fclose函数status=fclose(fid)status=fclose('all')例:打开一个名为std.dat的数据文件并进行读操作,命令为:fid=fopen('my.txt','r')78.1.2格式化数据的读写fprintf函数count=fprintf(fid,format,A...)fscanf函数[A,count]=fscanf(fid,format,size)8例8-1计算当x=[01]时f(x)=ex的值,并将结果写入到文件my.txt中。程序x=0:0.1:1;y=[x;exp(x)];%y有两行数据fid=fopen('my.txt','w');fprintf(fid,'%6.2f%12.8f\n',y);fclose(fid);9例8-2从上例中生成的文件my.txt中读取数据,并将结果输出到屏幕。程序fid=fopen('my.txt','r');[a,count]=fscanf(fid,'%f%f',[2inf]);fprintf(1,'%f%f\n',a);fclose(fid);输出同例8-1文件中的数据格式。108.1.3文件定位和文件状态1.feof函数:检测文件是否已经结束status=feof(fid)2.ferror函数:用于查询文件的输入、输出错误信息msg=ferror(fid)3.frewind函数:使位置指针重新返回文件的开头frewind(fid)4.fseek函数:设置文件的位置指针status=fseek(fid,offset,origin)5.ftell函数:用于查询当前文件指针的位置position=ftell(fid);11例8-3输出文件的大小。程序fid=fopen('my.txt','r');fseek(fid,0,'eof');x=ftell(fid);fprintf(1,'FileSize=%d\n',x);frewind(fid);x=ftell(fid);fprintf(1,'FilePosition=%d\n',x);fclose(fid);输出FileSize=231FilePosition=0128.1.4按行读取数据1.fgetl函数:按行从文件中读取数据,但不读取换行符。line=fgetl(fid)2.fgets函数:用于从文件中读取行、保留换行符并把行作为字符串返回。(1)line=fgets(fid)(2)line=fgets(fid,nchar)13例8-4编写一个程序,用于读取例8-1生成的数据。程序fid=fopen('my.txt','r');while~feof(fid)%在文件没有结束时按行读取数据s=fgets(fid);fprintf(1,'%s',s);endfclose(fid);输出同例8-1文件中的数据格式。148.1.5二进制数据文件的读写fwrite函数:用于向一个文件写入二进制数据count=fwrite(fid,A,precision)。fread函数:用于从文件中读二进制数据[A,count]=fread(fid,size,precision)注意:使用函数fread()和fwrite()读写文件时,必须以二进制方式打开文件15例8-5将5行5列“魔方阵”存入二进制文件中。程序fid=fopen('my.dat','w');a=magic(5);fwrite(fid,a,'long');fclose(fid);16例8-6从二进制文件中读取“魔方阵”。程序fid=fopen('my.dat','r');[A,count]=fread(fid,[5,inf],'long');fclose(fid);A178.1.6图像、声音文件的读写1.imread函数:从文件中读入图像A=imread(filename,fmt)[A,map]=imread(filename,fmt)2.image函数:显示图像image(A)3.imwrite函数:将图像写入文件imwrite(A,filename,fmt)imwrite(A,map,filename,fmt)18例8-7显示一幅真彩(RGB)图像。程序[x,map]=imread('C:\MATLAB7\toolbox\matlab\demos\street1.jpg');image(x);19例8-8将图像写入文件程序[x,map]=imread('C:\MATLAB7\toolbox\matlab\demos\street1.jpg');imwrite(x,'my.bmp');%将图像保存为真彩色的bmp[x,map]=imread('my.bmp');image(x);208.1.6图像、声音文件的读写4.imfinfo函数:查询图像文件信息innfo=imflnfo(filename)5.wavread函数:用于读取扩展名为“.wav”的声音文件y=wavread(file)[y,fs,nbits]=wavread(file)6.wavwrite函数:用于将数据写入到扩展名为“wav”的声音文件中wavwrite(y,fs,nbits,wavefile)7.wavplay函数:利用windows音频输出设备播放声音wavplay(y,fs)21例8-9读取一个音频数据文件,以不同频率播放,并显示声音波形。程序:y=wavread('C:\MATLAB7\toolbox\simulink\simdemos\simgeneral\toilet.wav')plot(y);wavplay(y);wavplay(y,11025);wavplay(y,44100);228.2应用程序接口MATLAB的外部接口应用包括如下内容:(1)在MATLAB中调用已有的C/C++语言代码;(2)在C/C++语言中调用MATLAB的算法;(3)利用COM标准进行客户/服务器模式开发;例如在VisualBasic程序或者MicrosoftExcel中调用MATLAB的算法(4)在C/C++语言中读写MAT数据文件。238.2.1MEX文件例8-10简单MEX文件示例mexHelloWorld.c。程序:#includemex.hvoidmexFunction(intnlhs,mxArray*plhs[],intnrhs,constmxArray*prhs[]){mexPrintf(HelloMatlabWorld!);}248.2.2MATLAB计算引擎MATLAB的计算引擎应用就是利用MATLAB提供的一组接口函数,在用户开发的C/C++语言应用程序中,通过某种通信机制后台调用MATLAB应用程序以完成复杂的系统任务。25例8-11设计一程序,在C/C++语言中调用mesh函数来绘制高斯矩阵的曲面。解题步骤:26例8-11程序:#includestdio.h#includeengine.hvoidmain(){Engine*ep;intstatus=0;//打开计算引擎ep=engOpen(NULL);if(ep==(Engine*)NULL){printf(错误:无法打开MATLAB计算引擎\n);exit(-1);}//执行MATLAB指令engEvalString(ep,mesh(peaks););getchar();//关闭MATLAB计算引擎status=engClose(ep);if(status!=0){printf(无法正常关闭MATLAB计算引擎\n);exit(-1);}}278.2.3基于COM组件的接口编程该方法的主要特点有:(1)应用程序完全脱离MATLAB工作环境;(2)MATLAB数学库和工具箱中包括的各种各样的函数,所以降低了编写算法难度;(3)由于将算法程序做成了COM组件的形式,所以实现了算法的保密。288.2.4在C/C++语言中读写MAT数据文件支持C/C++语言读写MAT文件的函数库有下面几个:1.打开数据文件──matOpenMATFile*matOpen(constchar*filename,constchar*mode)2.关闭数据文件──matCloseintmatClose(MATFile*mfp)3.获取变量──matGetVariablemxArray*matGetVariable(MATFile*mfp,constchar*name)4.写入数据──matPutVariableintmatPutVariable(MATFile*mfp,constchar*name,constmxArray*mp)29扩展阅读8.3结构数组8.4元胞数组8.5面向对象程序设计Matlab5+6i30应用举例例8-12在C/C++语言中调用MATLAB计算魔方阵,并将结果显示到屏幕。31程序代码-1#includeengine.h#includestdio.hvoidmain(){Engine*ep;double*p;mxArray*equation;inti=0,j=0;intstatus=0;//打开计算引擎ep=engOpen(NULL);if(ep==(Engine*)NULL){printf(错误:无法打开MATLAB计算引擎\n);exit(-1);}32程序代码-2//执行MATLAB指令engEvalString(ep,A=magic(5););equation=engGetVariable(ep,A);p=mxGetPr(equation);printf(\nMATLAB中计算magic(5)\n);for(i=0;i5;i++){for(j=0;j5;j++)printf(%8.0lf,*(p+i+j*5));printf(\n);}//关闭MATLAB计算引擎status=engClose(ep);if(status!=0){printf(无法正常关闭MATLAB计算引擎\n);exit(-1);}}33例8-1334程序代码-1#includestdio.h#includestring.h#includeengine.hvoidmain(){Engine*ep;intstatus=0;ep=engOpen(NULL);//执行MATLAB指令doubleA[]={2,3,4,-1,1,-1,3,-5,1},B[]={5,5,9};double*pa,*pb,*pc;mxArray*x,*y,*z;35程序代码-2x=mxCreateDoubleMatrix(3,3,mxREAL);y=mxCreateDoubleMatrix(3,1,
本文标题:Matlab教程Ch8(全)
链接地址:https://www.777doc.com/doc-2882133 .html