收藏 分享(赏)

第三讲 MATLAB程序设计.ppt

上传人:dzzj200808 文档编号:3364893 上传时间:2018-10-18 格式:PPT 页数:85 大小:2.01MB
下载 相关 举报
第三讲   MATLAB程序设计.ppt_第1页
第1页 / 共85页
第三讲   MATLAB程序设计.ppt_第2页
第2页 / 共85页
第三讲   MATLAB程序设计.ppt_第3页
第3页 / 共85页
第三讲   MATLAB程序设计.ppt_第4页
第4页 / 共85页
第三讲   MATLAB程序设计.ppt_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、第三讲 MATLAB程序设计,3.1 M文件3.2 数据的输入输出3.3 选择结构3.4 循环结构3.5 函数文件3.6 全局变量和局部变量 3.7 类和对象3.8 文件操作,3.1 M文件,3.1.1 M文件的建立与编辑 1.建立新的M文件(1)菜单操作:MATLAB命令窗口的File菜单 New菜单项 M-file命令。(2)命令操作:在MATLAB命令窗口输入命令edit。(3)命令按钮操作:单击MATLAB命令窗口工具栏上的“新建”命令按钮。2. 编辑已有的M文件,3.1.2 M文件的分类 分类:独立的m文件 称命令文件(Script File),主程序命令文件实际上是一串指令的集合,

2、与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。可调用m文件 称函数文件(Function File),子程序第一行包含function,需要输入变量,返回输出变量 主要区别:命令文件的变量在文件执行完后保存在内存中,而函数文件内定义的变量仅在函数文件内部起作用,执行完函数文件后,这些内部变量将被清除。,例3.1 建立一个命令文件将变量a,b的值互换,然后运行该命令文件。首先建立命令文件并以文件名exch.m存盘:clear all;a=1:10; b=11,12,13,14;15,16,17,18;c=a;a=b;b=c;ab然后在MATLAB的命令窗口中输入exch

3、,将会执行该命令文件。 exch,例3.2 建立一个函数文件将变量a,b的值互换,然后在命令窗口调用该函数文件。首先建立函数文件 fexch.m:function a,b = fexch(a,b)c=a; a=b; b=c;然后在MATLAB的命令窗口调用该函数文件:clear all;x=1:10; y=11,12,13,14;15,16,17,18;x,y=fexch(x,y),function r = rank(A,tol) %RANK Matrix rank. % RANK(A) provides an estimate of the number of linearly % inde

4、pendent rows or columns of a matrix A. % RANK(A,tol) is the number of singular values of A % that are larger than tol. % RANK(A) uses the default tol = max(size(A) * eps(norm(A). % % Class support for input A: % float: double, single% Copyright 1984-2004 The MathWorks, Inc. % $Revision: 5.11.4.3 $ $

5、Date: 2004/08/20 19:50:33 $s = svd(A); if nargin=1tol = max(size(A) * eps(max(s); end r = sum(s tol);,3.2 数据的输入输出,3.2.1 input函数 调用格式为:A=input (提示信息,选项);其中提示信息为一个字符串,用于提示用户输入什么样的数据。A=input(A= ) 如果在input函数调用时采用s选项,则允许用户输入一个字符串。例如,想输入一个人的姓名,可采用命令:xm = input (Whats your name?, s),3.2.2 disp函数调用格式为:disp(

6、输出项)其中输出项既可以为字符串,也可以为矩阵。注意:用disp函数显示矩阵时将不显示矩阵的名字,而且其格式更紧密,且不留任何没有意义的空行。,b =2 3 45 6 78 9 0 disp (b)2 3 45 6 78 9 0,disp( Jan Feb Mar) disp(rand(5,3)Jan Feb Mar0.9501 0.7621 0.61540.2311 0.4565 0.79190.6068 0.0185 0.92180.4860 0.8214 0.73820.8913 0.4447 0.1763,程序如下:a=input(a=?);b=input(b=?);c=input(c

7、=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a), (-b-sqrt(d)/(2*a)disp(x1=,num2str(x(1),x2=,num2str(x(2);,例3.3 求一元二次方程ax2 +bx+c=0的根。,其调用格式为:pause(延迟秒数)如果省略延迟时间,直接使用pause,则将暂停程序,直到用户按任一键后程序继续执行。 pause命令在程序调试以及需要看中间结果时特别有用。若要强行中止程序的运行可使用Ctrl+C命令。,3.2.3 pause函数,3.3 选择结构,3.3.1 if语句在MATLAB中,if语句有3种格式。1.单分支if语句语句格式为:

8、if 条件语句组end当条件成立时,则执行语句组,执行完之后继续执行if 语句的后继语句,若条件不成立,则直接执行if语句的后继语句。,2.双分支if语句语句格式为:if 条件语句组1else语句组2end当条件成立时,执行语句组1,否则执行语句组2,语句组1或语句组2执行后,再执行if语句的后继语句。,例3.4计算分段函数值。,程序如下:x=input(请输入x的值:);if x=10y=cos(x+1)+sqrt(x*x+1);elsey=x*sqrt(x+sqrt(x);endy,例3.5 输入数n,判断其奇偶性,程序如下:n = input(n=), if rem(n,2)=0A =

9、evenelseA = oddend,3.多分支if语句 语句格式为: if 条件1语句组1 elseif 条件2语句组2 elseif 条件m语句组m else语句组m+1 end,例3.6 输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,若为数字字符则输出其对应的数值,若为其他字符则原样输出。c=input(请输入一个字符,s);if c=A end,if a=b if isequal(a,b) isempty all any,3.3.2 switch语句其语句格式为:switch 表达式case 表达式1语句组1case 表达式2语句组2case 表达式m语

10、句组motherwise语句组m+1end,n = input(n=) switch mod(n,2)case 1A = oddcase 0A = evenotherwiseA = null end,例3.7 判断输入数n的奇偶性,price=input(请输入商品价格); switch fix(price/100) case 0,1rate=0;case 2,3,4rate=3/100;case num2cell(5:9)rate=5/100;case num2cell(10:24)rate=8/100;case num2cell(25:49)rate=10/100;otherwiserat

11、e=14/100; end price=price*(1-rate),例3.8 某商场对顾客所购买的商品实行打折销售,已知打折标准,求所售商品的实际销售价格。,3.3.3 try语句 (错误控制语句) 语句格式为: try语句组1 catch语句组2 endtry语句先试探性执行语句组1,如果语句组1在执行过程中出现错误,则将错误信息赋给保留的lasterr变量,并转去执行语句组2。这种试探性执行语句是其他高级语言所没有的。,例3.9 矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则自动转去求两矩阵的点乘。A=1,2,3;4,5,6; B=7,8,9;10,11,12

12、; tryC=A*B; catchC=A.*B; end C lasterr %显示出错原因,3.4 循环结构,3.4.1 for语句语句格式为:for 循环变量=初值 : 增量 : 终值循环体语句end,例3.10 已知y的表达式,当n=100时,求y的值。y=0; n=100;for i=1:ny=y+1/i2;endy在实际MATLAB编程中,为提高程序的执行速度,常用向量运算来代替循环操作:n=100; i=1:n;f=1./i.2;y=sum(f),例3.11 求定积分。a=0; b=3*pi; n=1000; h=(b-a)/n;x = a:h:b; f=exp(-0.5*x).*

13、sin(x+pi/6);for i=1:ns(i)= (f(i)+f(i+1)*h/2;ends=sum(s)事实上,MATLAB提供了有关数值积分的标准函数,实际应用中可直接调用这些函数求数值积分。,for语句更一般的格式:for 循环变量=矩阵表达式循环体语句end执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。实际上,“初值 : 增量 : 终值” 是一个仅为一行的矩阵(行向量),因而列向量是单个数据。,例3.12 已知5个学生4门功课的成绩,求每名学生的总成绩。s=0; a=65, 76, 56, 78; 98, 83, 74, 85; 76, 67

14、, 78, 79; 98, 58, 42, 73; 67, 89, 76, 87; for k=as=s+k; end disp(s);,65 76 56 7898 83 74 8576 67 78 7998 58 42 7367 89 76 87,3.4.2 while语句while语句的一般格式为:while (条件)循环体语句end其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环,例3.13 根据矩阵指数的幂级数展开式求矩阵指数。X=input(X=);E=zeros(size(X);F=eye(size(X);n=1;while norm(F,

15、1)0E=E+F;F=F*X/n;n=n+1;endEexpm(X) %调用MATLAB矩阵指数函数求矩阵指数,与循环结构相关的还有一个break语句,当在循环体内执行到该语句时,程序将跳出循环。该语句一般与if语句配合使用。 在多重循环中,break只能使程序跳出包含它的最内层的那个循环,例3.14 用while语句实现例3.10。y=0; i=1;while 1f=1/i/i;y=y+f;if i= =100break;endi=i+1;end,3.4.3 循环的嵌套如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。可以按照嵌套层数,分别叫做二重循环、三重循

16、环等。处于内部的循环叫作内循环,处于外部的循环叫作外循环。 在设计多重循环时,要特别注意内、外循环之间的关系,以及各语句放置的位置,不要搞错。,例3.15 列出从2到m的全部素数。m=input(m=); p=2:m;for i=2:sqrt(m) %依次列出最大除数n = find(rem(p,i)=0 % 去掉该数endp % 显示结果,3.5 函数文件,3.5.1 函数文件的基本结构函数文件由function语句引导,其基本结构为:function 输出形参表 = 函数名(输入形参表)注释说明部分函数体语句,例3.16 编写函数文件求半径为r的圆的面积和周长。function s,p =

17、 fcircle(r)%CIRCLE calculate the area and perimeter of a circle of radii r% r 圆半径% s 圆面积% p 圆周长%2001年7月30日编s=pi*r*r;p=2*pi*r; 将以上函数文件以文件名fcircle.m存入c:matlab6p5work下,然后在MATLAB命令窗口调用该函数:s,p=fcircle(10),3.5.2 函数调用函数调用的一般格式是:输出实参表=函数名(输入实参表)例3.17 利用函数文件,实现直角坐标(x,y)与极坐标(,)之间的转换。函数文件 tran.mfunction rho,th

18、eta = tran(x,y)rho = sqrt(x*x+y*y);theta = atan(y/x);调用tran.m的命令文件main1.m:x=input(Please input x=:);y=input(Please input y=:);rho,theta=tran(x,y);rho, theta,例3.18 利用函数的递归调用,求n!。递归调用函数文件factor.m:function f = factor(n) if n=1f = 1; elsef = factor(n-1)*n; end在命令文件main2.m中调用函数文件factor.m求s=1!+2!+3!+4!+5!

19、。,3.5.3 函数所传递参数的可调性在调用函数时,MATLAB用两个永久变量nargin和nargout分别记录调用该函数时的输入实参和输出实参的个数。只要在函数文件中包含这两个变量,就可以准确地知道该函数文件被调用时的输入输出参数个数,从而决定函数如何进行处理。,例3.19 nargin用法示例。函数文件examp.m:function fout = examp (a,b,c)if nargin = 1fout = a;elseif nargin = 2fout = a+b;elseif nargin = 3fout=(a*b*c)/2;end,命令文件mydemo.m: %x = 1:3

20、;y = 1;2;3;out1 = examp(x)out2 = examp(x,y)out3 = examp(x,y,3),3.6 全局变量和局部变量,全局变量用命令global定义。函数文件的内部变量是局部的,与其他函数文件及MATLAB工作空间相互隔离。例3.20 全局变量应用示例。先建立函数文件weight_add.m,该函数将输入的参数加权相加。function f=weight_add(x,y)global ALPHA BETAf=ALPHA*x+BETA*y;,在命令窗口中输入:global ALPHA BETAALPHA=1;BETA=2;s=weight_add(1,2),数

21、值数据(Numeric):双精度型(double)、单精度数、带符号整数(int8)和无符号整数(uint8)。 字符数据(char) 。 结构型(structure)和细胞型(cell)。 稀疏型(sparse)。,3.7 数据类型,结构和单元,结构数据MATLAB通过使用结构(structure)数据类型把一组不同类型的数据同时又是在逻辑上相关的数据组成一个有机的整体,以便于管理和引用。1. 结构矩阵的建立与引用2. 结构成员的修改,1. 结构矩阵的建立与引用,(1)用赋值语句定义 student.name = Leslie; student.num = 123456; student.t

22、est=79 75 73;180 178 177.5;22 210 205; student student = name: Leslienum: 123456test: 3x3 double, student(2).name = David; student(2).num = 123532; student(2).test=68 70 68;118 118 119;172 170 169; 23 543 433; student student = 1x2 struct array with fields:namenumtest fieldnames(student) ans = namen

23、umtest,(2) 用函数struct定义,调用格式:结构数组名 = struct (属性1,属性值1,属性2,属性值2, ) s = struct(type,big,little,color,red,x,3 4),2. 结构成员的修改, str = student(2).name n = student(2).test(4,2) student(2).test(4,2) = 0 for i=1 : length (student) disp(student(i).name) end 删除属性的命令: student2 = rmfield(student,test),细胞数据细胞(Cell)

24、数据的概念与结构有些类似,也是把不同属性的数据放在一个变量中。所不同的是,结构变量的各个元素下有成员,每个成员都有自己的名字,对成员的引用是:结构变量名.成员名。而细胞矩阵的各个元素就是不同类型的数据,用带有大括号下标的形式引用单元矩阵元素。, A=1 2 3 4;2 3 4 5; 3 4 5 6A =1 2 3 42 3 4 53 4 5 6 C=A sum(A) sum(sum(A)C = 3x4 double 1x4 double 42,1. 细胞矩阵的生成和引用,(1)用赋值语句定义, clear A; A(1,1)=1 4 3;0 5 8; 7 2 9; A(1,2)=Leslie;

25、 A(2,1)=3+7i; A(2,2)=0:pi/10:pi;, clear A; A1,1=1 4 3; 0 5 8; 7 2 9; A1,2=Leslie; A2,1=3+7i; A2,2=0 : pi/10 : pi;, 是矩阵的标志, 是细胞数组的标志。二者不同是:大括号可以嵌套,细胞数组的元素可以是细胞数组,而中扩号不可以。,C=1 2,3 4;5 6,7 8 生成一个2X2的细胞数组,数组每个元素都为1X2的数值矩阵。,(2) 用cell预定义数组,然后用赋值语句给每个元素赋值 B=cell(5,3) %定义一个5x3的细胞数组 B(1,3)=1:3celldisp: 显示细胞数

26、组的每个元素的值。 cellplot:画出细胞数组的每个元素的结构图。,综合使用大括号和小括号可以取出细胞数组的某个元素或某些元素的值,也可取出某个元素值的一部分。 c=A1,2 d=A1,1(2,2) c=A(2:2,1:2),3.8 类和对象 类的概念是结构体的拓展,在类中,不但可以包含变量成员,还可以包含与这些变量相关联的函数或运算。对象是类的一个具体实例。 类和对象的概念是面向对象程序设计(Object-oriented Programming)的基础。采用面向对象技术可以把复杂的操作过程加以隐藏,而外部呈现为人们所习惯的处理形式。例3.19 建立一个整数类integer,该类含有一个

27、数据成员n,代表一个3 位整数。还具有显示整数各位数字之和、各位数字平方和、各位数字立方和等功能。,3.9 文件操作 (Low-Level File I/O Functions),3.8.1 文件的打开与关闭1. 打开文件fopen函数的调用格式为:fid= fopen(文件名,使用文件方式)2. 关闭文件调用格式为:sta=fclose(fid),filename = input(Open file:,s); fid,message = fopen (filename,r); if fid=-1disp ( message); end,3.9.2 二进制文件读写操作1. 读二进制文件frea

28、d 函数可以读取二进制文件的数据,并将数据存入矩阵。其调用格式为:A,count=fread(fid,size, precision) 例: Fid,message = fopen(matrix.dat,r); If Fid=-1 disp (message) end; A = fread(Fid,100),2. 写二进制文件fwrite 函数按照指定的数据精度将矩阵中的元素写入到文件中,并返回存入数据的个数。其调用格式为:count=fwrite (Fid, A, precision) 例: File = fopen(magic.bina,w) Count = fwrite(File,mag

29、ic(4),int32) Status = fclose(File),3.8.3 文本文件读写操作1. 读文本文件fscanf 函数可以读取文本文件的内容,并按指定格式存入矩阵。其调用格式为:A,COUNT= fscanf (Fid, format, size)2. 写文本文件fprintf 函数可以将数据按指定格式写入到文本文件中。其调用格式为:COUNT= fprintf(Fid, format, A)例3.20 从键盘输入5名学生的姓名和成绩,先建立一个数据文件,然后读出数据文件的内容,并按成绩从低到高的顺序在屏幕上输出学生信息。,3.8.4 数据文件定位fseek函数用于定位文件位置指

30、针,其调用格式为:status = fseek(Fid, offset, origin) origin为给定的初始位置,为cof,bof,eof之一。 cof:表示文件中的当前位置 bof:表示文件的开始位置 eof:表示文件的结束位置ftell函数返回文件指针的当前位置,其调用格式为:position = ftell (Fid),例3.21 分析下列程序执行后,four、position和three三个变量的值。 a=1:5; Fid=fopen(fdat.bin, w); %以写方式打开文件fdat.bin fwrite(Fid, a, int16 ); %将a的元素以双字节整型写入文件%

31、fdat.bin status=fclose(Fid); Fid=fopen(fdat.bin, r); %以读数据方式打开文件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=fc

32、lose(Fid);,Importing and Exporting Data,The format of the data: text, binary, or a standard format such as HDF The easiest way to import data into MATLAB is to use the Import Wizard.,Importing Text Data,Text DataIn text format, the data values are American Standard Code for Information Interchange (

33、ASCII) codes that represent alphabetic and numeric characters. ASCII text data can be viewed in a text editor. Using the Import Wizard with Text Data Using Import Functions with Text Data,Using the Import Wizard with Text Data,ASCII Data File Formats,ASCII Data Import Function Feature Comparison,ASC

34、II Data Import Function Feature Comparison,1. Importing Numeric Text Data,如果数据文件中只包含数字,根据分隔符的不同,可以选择很多import function. Load -分隔符是space ,最简单的命令! 例:有一个文件 my_data.txt ,只含数字,分隔符是space1 2 3 4 56 7 8 9 10 load my_data.txt在workspace中产生一个变量,跟文件名一样(去掉扩展名)。如果想产生一个和文件名不一样的变量名,应用: A=load (my_data.txt), load my_

35、data.txt whos Name Size Bytes Classmy_data 2x5 80 double arrayGrand total is 10 elements using 80 bytes my_data my_data =1 2 3 4 56 7 8 9 10 A=load (my_data.txt) A =1 2 3 4 56 7 8 9 10,2. Importing Delimited ASCII Data Files,dlmread-分隔符是any character ,最简单的命令! 例:有一个文件 ph.dat ,内容被分号隔开7.2;8.5;6.2;6.65.

36、4;9.2;8.1;7.2把这个文件读进工作空间,并命名为变量A A = dlmread(ph.dat, ;)dlmread 忽略数据元素之间的空格 7.2;8.5; 6.2;6.6 5.4;9.2;8.1;7.2,3. Importing Numeric Data with Text Headers,textread导入包含文本标题的数据文件 例:有一个文件 grades.dat ,包含一行文本标题Grade1 Grade2 Grade378.8 55.9 45.999.5 66.8 78.089.5 77.0 56.7 grade1 grade2 grade3 = textread (gr

37、ades.dat,%f %f %f, headerlines,1),grade1 =78.800099.500089.5000grade2 =55.900066.800077.0000grade3 =45.900078.000056.7000,4. Importing Mixed Alphabetic and Numeric Data,textread可以返回多个输出变量,并可以指定每个变量的数据类型例:有一个文件 mydata.dat ,包含一行文本标题Sally Type1 12.34 45 YesLarry Type2 34.56 54 YesTommy Type1 67.89 23 N

38、o names,types,x,y,answer = textread(mydata.dat,%s %s %f %d %s) names,types,x,y,answer=textread (mydata.dat,%s %s %f %d %s, delimiter,;),names = SallyLarryTommy types = Type1Type2Type1,x =12.340034.560067.8900 y =455423 answer = YesYesNo,Exporting ASCII Data,Exporting ASCII Data,1. Exporting Delimite

39、d ASCII Data Files,save -easy to use! 例:To export the array A,A = 1 2 3 4 ; 5 6 7 8 ; save my_data.out A -ASCII,If you view the created file in a text editor, it looks like this: 1.0000000e+000 2.0000000e+000 3.0000000e+000 4.0000000e+000 5.0000000e+000 6.0000000e+000 7.0000000e+000 8.0000000e+000,

40、By default, save uses spaces as delimiters,1. Exporting Delimited ASCII Data Files,dlmwrite -flexibility! 以ASCII 格式导出一个矩阵,并指定文件中的分隔符 例:To export the array A,A = 1 2 3 4 ; 5 6 7 8 ; dlmwrite(my_data.out, A, ;),If you view the created file in a text editor, it looks like this: 1;2;3;4 5;6;7;8, dlmwrit

41、e does not insert delimiters at the end of rows. By default, if you do not specify a delimiter, dlmwrite uses a comma as a delimiter.,2. Using the diary Command to Export Data,diary -flexibility! diary creates a verbatim copy of your MATLAB session in a disk file (excluding graphics). 例:if you have

42、the array A in your workspace,A = 1 2 3 4 ; 5 6 7 8 ; 1. Turn on the diary function.diary my_data.out 2. Display the contents of the array you want to export. This example displays the array A. You could also display a cell array or other MATLAB data type.A = 1 2 3 45 6 7 8,3. Turn off the diary fun

43、ction.diary off diary creates the file my_data.out and records all the commands executed in the MATLAB session until it is turned off.A =1 2 3 45 6 7 8diary off4. Open the diary file my_data.out in a text editor and remove all the extraneous text.,Importing Binary Data,Using the Import Wizard with Binary Data FilesUsing Import Functions with Binary Data,Exporting Binary Data,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 大学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报