资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,本章内容:,变量类型;,基本表达式;,数据类型;,运算符与操作符;,关系运算与逻辑运算;,三种程序结构;,程序流控制语句;,两种,M,文件;,M,文件的调试。,矩阵创建、保存和提取方法;,矩阵元素标识、矩阵函数、矩阵运算、数组运算、数组函数、数据的输出。,第二章 矩阵及其基本运算,本章练习:,表达式、流程控制练习;,矩阵基本运算练习,一、变量和数据操作,1.,变量,变量命名在,MATLAB 6.5,中,变量名是以字母开头,后接字母、数字或下划线的字符序列,最多,63,个字符。,在,MATLAB,中,变量名区分字母的大小写。,2,赋值语句,(1),变量,=,表达式,(2),表达式其中表达式是用运算符将有关运算量连接起来的式子,其结果是一个矩阵。,例,2-1,计算表达式的值,并显示计算结果。在,MATLAB,命令窗口输入命令:,x=(0:0.1:10000).*pi./360;,y1=sin(x);,y2=sin(1.05*x);,y3=sin(0.1*x);,y4=sin(5*x);,plot(x,y1+y2);,plot(x,y3.*y4);,拍现象,信号调制,3.,预定义变量,在,MATLAB,工作空间中,还驻留几个由系统本身定义的变量。例如,用,pi,表示圆周率,的近似值,用,i,,,j,表示虚数单位。,预定义变量有特定的含义,在使用时,应尽量避免对这些变量重新赋值。,二、,MATLAB,常用数学函数,MATLAB,提供了许多数学函数,函数的自变量规定为矩阵变量,运算法则是将函数逐项作用于矩阵的元素上,因而运算的结果是一个与自变量同维数的矩阵。,函数使用说明:,(1),三角函数以弧度为单位计算。,(2)abs,函数可以求实数的绝对值、复数的模、字符串的,ASCII,码值。,(3),用于取整的函数有,fix,、,floor,、,ceil,、,round,,要注意它们的区别。,(4)rem,与,mod,函数的区别。,rem(x,y),和,mod(x,y),要求,x,y,必须为相同大小的实矩阵或为标量。,三、矩阵的建立和引用,1,矩阵的建立,直接输入法,最简单的建立矩阵的方法是从键盘直接输入矩阵的元素。具体方法如下:将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。,利用冒号表达式建立一个向量,冒号表达式可以产生一个行向量,一般格式是:,e1:e2:e3,其中,e1,为初始值,,e2,为步长,,e3,为终止值。,在,MATLAB,中,还可以用,linspace,函数产生行向量。其调用格式为:,linspace(a,b,n),其中,a,和,b,是生成向量的第一个和最后一个元素,,n,是元素总数。显然,,linspace(a,b,n),与,a:(b-a)/(n-1):b,等价。,2.,引用矩阵的元素,通过下标引用矩阵的元素,,例如,A(3,2)=200,采用矩阵元素的序号来引用矩阵元素,。矩阵元素的序号就是相应元素在内存中的排列顺序。在,MATLAB,中,矩阵元素按列存储,先第一列,再第二列,依次类推。例如,A=1,2,3;4,5,6;A(3)ans=2,显然,序号,(Index),与下标,(Subscript),是一一对应的,以,mn,矩阵,A,为例,矩阵元素,A(i,j),的序号为,(j-1)*m+i,。其相互转换关系也可利用,sub2ind,和,ind2sub,函数求得。,3,矩阵拆分,(1),利用冒号表达式获得子矩阵 ,A(:,j),表示取,A,矩阵的第,j,列全部元素;,A(i,:),表示,A,矩阵第,i,行的全部元素;,A(i,j),表示取,A,矩阵第,i,行、第,j,列的元素。,A(i:i+m,:),表示取,A,矩阵第,i,i+m,行的全部元素;,A(:,k:k+m),表示取,A,矩阵第,k,k+m,列的全部元素,,A(i:i+m,k:k+m),表示取,A,矩阵第,i,i+m,行内,并在第,k,k+m,列中的所有元素。此外,还可利用一般向量和,end,运算符来表示矩阵下标,从而获得子矩阵。,end,表示某一维的末尾元素下标。,4.,特殊矩阵的生成常用的产生通用特殊矩阵的函数有:,zeros,:产生全,0,矩阵,(,零矩阵,),。,ones,:产生全,1,矩阵,(,幺矩阵,),。,eye,:产生单位矩阵。,rand,:产生,0,1,间均匀分布的随机矩阵。,randn,:产生均值为,0,,方差为,1,的标准正态分布随机矩阵。,例,2-2,分别建立,33,、,32,和与矩阵,A,同样大小的零矩阵。,(1),建立一个,33,零矩阵。,zeros(3)(2),建立一个,32,零矩阵。,zeros(3,2)(3),设,A,为,23,矩阵,则可以用,zeros(size(A),建立一个与矩阵,A,同样大小零矩阵。,A=1 2 3;4 5 6;%,产生一个,23,阶矩阵,Azeros(size(A)%,产生一个与矩阵,A,同样大小的零矩阵,例,2-3,建立随机矩阵:,(1),在区间,20,50,内均匀分布的,5,阶随机矩阵。,(2),均值为,0.6,、方差为,0.1,的,5,阶正态分布随机矩阵。命令如下:,x=20+(50-20)*rand(5)y=0.6+sqrt(0.1)*randn(5),用于专门学科的特殊矩阵,(1),魔方矩阵魔方矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于,n,阶魔方阵,其元素由,1,2,3,n2,共,n2,个整数组成。,MATLAB,提供了求魔方矩阵的函数,magic(n),,其功能是生成一个,n,阶魔方阵。,例,2-5,将,101125,等,25,个数填入一个,5,行,5,列的表格中,使其每行每列及对角线的和均为,565,。,M=100+magic(5),(2),帕斯卡矩阵我们知道,二次项,(x+y)n,展开后的系数随,n,的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡,(Pascal),矩阵。函数,pascal(n),生成一个,n,阶帕斯卡矩阵。,例,2-7,求,(x+y),5,的展开式。在,MATLAB,命令窗口,输入命令:,pascal(6),矩阵次对角线上的元素,1,5,10,10,5,1,即为展开式的系数。,四、,MATLAB,运算,1.,算术运算,MATLAB,的基本算术运算有:,(,加,),、,(,减,),、*,(,乘,),、,/(,右除,),、,(,左除,),、,(,乘方,),。注意,运算是在矩阵意义下进行的,单个数据的算术运算只是一种特例。,(1),矩阵加减运算 假定有两个矩阵,A,和,B,,则可以由,A+B,和,A-B,实现矩阵的加减运算。运算规则是:若,A,和,B,矩阵的维数相同,则可以执行矩阵的加减运算,,A,和,B,矩阵的相应元素相加减。如果,A,与,B,的维数不相同,则,MATLAB,将给出错误信息,提示用户两个矩阵的维数不匹配。,(2),矩阵乘法 假定有两个矩阵,A,和,B,,若,A,为,mn,矩阵,,B,为,np,矩阵,则,C=A*B,为,mp,矩阵。,(3),矩阵除法在,MATLAB,中,有两种矩阵除法运算:,和,/,,分别表示左除和右除。如果,A,矩阵是非奇异方阵,则,AB,和,B/A,运算可以实现。,AB,等效于,A,的逆左乘,B,矩阵,也就是,inv(A)*B,,而,B/A,等效于,A,矩阵的逆右乘,B,矩阵,也就是,B*inv(A),。对于含有标量的运算,两种除法运算的结果相同,如,3/4,和,43,有相同的值,都等于,0.75,。又如,设,a=10.5,25,,则,a/5=5a=2.1000 5.0000,。对于矩阵来说,左除和右除表示两种不同的除数矩阵和被除数矩阵的关系。对于矩阵运算,一般,ABB/A,。,(4),矩阵的乘方 一个矩阵的乘方运算可以表示成,Ax,,要求,A,为方阵,,x,为标量。,2,点运算 在,MATLAB,中,有一种特殊的运算,因为其运算符是在有关算术运算符前面加点,所以叫点运算。点运算符有,.*,、,./,、,.,和,.,。两矩阵进行点运算是指它们的对应元素进行相关运算,要求两矩阵的维参数相同。,3.,关系运算,MATLAB,提供了,6,种关系运算符:,(,小于,),、,(,大于,),、,=(,大于或等于,),、,=(,等于,),、,=(,不等于,),。它们的含义不难理解,但要注意其书写方法与数学中的不等式符号不尽相同。,关系运算符的运算法则为:,(1),当两个比较量是标量时,直接比较两数的大小。若关系成立,关系表达式结果为,1,,否则为,0,。,(2),当参与比较的量是两个维数相同的矩阵时,比较是对两矩阵相同位置的元素按标量关系运算规则逐个进行,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由,0,或,1,组成。,(3),当参与比较的一个是标量,而另一个是矩阵时,则把标量与矩阵的每一个元素按标量关系运算规则逐个比较,并给出元素比较结果。最终的关系运算的结果是一个维数与原矩阵相同的矩阵,它的元素由,0,或,1,组成。,例,2-8,产生,5,阶随机方阵,A,,其元素为,10,90,区间的随机整数,然后判断,A,的元素是否能被,3,整除。,(1),生成,5,阶随机方阵,A,。,A=fix(90-10+1)*rand(5)+10)(2),判断,A,的元素是否可以被,3,整除。,P=rem(A,3)=0,其中,,rem(A,3),是矩阵,A,的每个元素除以,3,的余数矩阵。此时,,0,被扩展为与,A,同维数的零矩阵,,P,是进行等于,(=),比较的结果矩阵。,4.,逻辑运算,MATLAB,提供了,3,种逻辑运算符:,&(,与,),、,|(,或,),和,(,非,),。逻辑运算的运算法则为:,(1),在逻辑运算中,确认非零元素为真,用,1,表示,零元素为假,用,0,表示。,(2),设参与逻辑运算的是两个标量,a,和,b,,那么,,a&b a,b,全为非零时,运算结果为,1,,否则为,0,。,a|b a,b,中只要有一个非零,运算结果为,1,。,a,当,a,是零时,运算结果为,1,;当,a,非零时,运算结果为,0,。,(3),若参与逻辑运算的是两个同维矩阵,那么运算将对矩阵相同位置上的元素按标量规则逐个进行。最终运算结果是一个与原矩阵同维的矩阵,其元素由,1,或,0,组成。,(4),若参与逻辑运算的一个是标量,一个是矩阵,那么运算将在标量与矩阵中的每个元素之间按标量规则逐个进行。最终运算结果是一个与矩阵同维的矩阵,其元素由,1,或,0,组成。,例,2-9,建立矩阵,A,,然后找出大于,4,的元素的位置。,(1),建立矩阵,A,。,A=4,-65,-54,0,6;56,0,67,-45,0(2),找出大于,4,的元素的位置。,find(A4),5.,矩阵的转置与旋转,矩阵的转置,转置运算符是单撇号,(),。,矩阵的旋转,利用函数,rot90(A,k),将矩阵,A,旋转,90,的,k,倍,当,k,为,1,时可省略。,6,矩阵的翻转,矩阵的左右翻转,对矩阵实施左右翻转是将原矩阵的第一列和最后一列调换,第二列和倒数第二列调换,,,依次类推。,MATLAB,对矩阵,A,实施左右翻转的函数是,fliplr(A),。,矩阵的上下翻转,MATLAB,对矩阵,A,实施上下翻转的函数是,flipud(A),。,五、字符串,在,MATLAB,中,字符串是用单撇号括起来的字符序列。,MATLAB,将字符串当作一个行向量,每个元素对应一个字符,其标识方法和数值向量相同。也可以建立多行字符串矩阵。,字符串是以,ASCII,码形式存储的。,abs,函数可以用来获取字符串矩阵所对应的,ASCII,码数值矩阵。相反,,char,函数可以把,ASCII,码矩阵转换为字符串矩阵。,例,2-13,建立一个字符串向量,然后对该向量做如下处理:,(1),取第,1,5,个字符组成的子字符串。,(2),将字符串倒过来重新排列。,(3),将字符串中的小写字母变成相应的大写字母,其余字符不变。,(4),统计字符串中小写字母的个数。,命令如下:,ch=ABc123d4e56Fg9;subch=ch(1:5)%,取子字符串,revch=ch(end:-1:1)%,将字符串倒排,k=find(ch=a%,找小写字母的位置,ch(k)=ch(k)-(a-A);%,将小写字母变成相应的大写字母,char(ch)length(k)%,统计小写字母的个数,六、结构数据和单元数据,结构数据,结构矩阵的建立与引用,结构矩阵的元素可以是不同的数据类型,它能将一组具有不同属性的数据纳入到一个统一的变量名下进行管理。建立一个结构矩阵可采用给结构成员赋值的办法。具体格式为:,结构矩阵名,.,成员名,=,表达式,其中表达式应理解为矩阵表达式。,结构成员的修改,可以根据需要增加或删除结构的成员。例如要给结构矩阵,a,增加一个成员,x4,,可给,a,中任意一个元素增加成员,x4,:,a(1).x4=410075;,但其他成员均为空矩阵,可以使用赋值语句给它赋确定的值。要删除结构的成员,则可以使用,rmfield,函数来完成。例如,删除成员,x4,:,a=rmfield(a,x4);,2,单元数据,单元矩阵的建立与引用,建立单元矩阵和一般矩阵相似,只是矩阵元素用大括号括起来。可以用带有大括号下标的形式引用单元矩阵元素。例如,b3,3,。单元矩阵的元素可以是结构或单元数据。可以使用,celldisp,函数来显示整个单元矩阵,如,celldisp(b),。还可以删除单元矩阵中的某个元素。,七,.M,文件的编辑与调试,用,MATLAB,的程序文件是以,.m,为扩展名的文本文件,称为,M,文件。其语句的执行相当于依次在命令窗口输入相应的命令,.,M,文件中,说明性的文字,(,注释,),用,%,开头,用,Help,命令可以显示说明文字的内容,例,Hello.m,%program hello.m,%Hello,Students!,%Good morning!,%Study hard and make progress every day!,%Good good study,day day up!%,上段程序运行结果,:,无任何显示,.,将,%Hello,Students!,修改成,disp(Hello,Students!),重新运行,理解注释的作用,注意编程风格,:,必要的注释,;,分进缩写,;,模块化,;,做研究笔记,记下各个文件的功能及注意事项,.,八,.,文件内容的输入与修改,输入,修改,保存,程序的调试,九,.,流程控制之循环结构,For,循环,语法,:,for,循环变量,=,初值,:,步长,:,终值,循环体,end,例,:,连加算法,%multiplus1.m,s=0,for i=1:1000,s=s+I;,end,sprintf(s=%d,s),例,:,累乘算法,%multitime1.m,p=1;,for n=1:1:10,p=p*n;,end,sprintf(p=%dn,p),例,:,连加算法和累乘算法的合用:求,e,的值。,%programe e1.m,%Gives the exp number e,E=1;,for n=1:100,p=1;,for m=1:n,p=p*m;,end,E=E+1/p;,end,sprintf(p=%fn,p),例:在非线性物理中的应用举例。画出,logistic,映射图,迭代函数:,%programe bug.m,虫口模型,x=0.6;,u=2.6:0.001:4;,for j=1:150%,迭代,150,次可稳定,x=u.*(x-x.2);,end,for i=1:100,x=u.*(x-x.2);,plot(u,x,r,marker,.,markersize,1);,hold on,end,3.,流程控制之循环结构,(2)While,循环,语法:,while,条件表达式,循环体语句,end,while,语句的一般格式为:,while(,条件,),循环体语句,end,例:用,While,循环实现连加算法,%multiplus1.m,s=0,for i=1:1000,s=s+i;,end,sprintf(s=%d,s),%multiplus2.m,s=0;,N=1;,While n=1000,s=s+n;,n=n+1;,end,sprintf(s=%d,s),十,.,流程控制之分支结构,(1)if-else-end,语句,语法:,if,逻辑表达式,语句体,1,else,语句体,2,end,说明:当条件成立时,执行语句组,1,,否则执行语句组,2,。,扩展:,精简:,例:分段函数的取值,x=input(,请输入,x,的值,:);,if x=0,y=(x+sqrt(pi)/exp(2);,else,y=log(x+sqrt(1+x*x)/2;,end,y,(2,),switch-case,语句,switch,语句根据表达式的取值不同,分别执行不同的语句,其语句格式为:,switch,表达式,case,值,1,语句组,1,case,值,2,语句组,2,case,值,m,语句组,m,otherwise,语句组,n,end,十一,.,数据的输入输出,(1),键盘输入数据,从键盘输入数据,可以用函数,input,实现,.,格式,:,A=input(,提示信息,选项,);,字符串,s,时,输入为字符串,无此项时为数值,.,例,:,Xm=input(whats your name?,s);,(2),在命令窗口输出数据,disp,函数可提供在命令窗口输出数据的功能,.,格式,:,disp(,输出项,),可以是矩阵,也可以是字符串,.,有多项时用方括号括起,.,例程,:,求一元二次方程的根,a=input(a=?);,b=input(b=?);,c=input(c=?);,d=b*b-4*a*c;,x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);,disp(x1=,num2str(x(1),x1=,num2str(x(2),(3),磁盘文件的打开与关闭,打开文件,语法,:,fid=fopen(filename,permission);,文件标识符,(,内存变量名,),磁盘文件名,打开模式,r,读模式,w,写模式,(3),磁盘文件的打开与关闭,关闭文件,语法,:,fclose(fid);,例,:,打开一个文件,准备写入数据,.,x=0:0.2:2;,y=x;2*exp(x);,fid=fopen(test1.txt,w),%fprintf(fid,%6.2f%12.8fn,y);,fclose(fid);,(4),磁盘文件的写入,命令,fprintf,语法,:,count=fprintf(fid,format,A,),(4),磁盘文件的读出,命令,fscanf,语法,:,A,count=fscanf(fid,format,size),例,:fid=fopen(test1.txt,r);,A,c=fprintf(fid,%f%f,32);,十二,.,模块化的程序设计,:,函数文件,(1),函数文件的建立,函数文件由,function,语句引导,其基本结构为,Function,输出形参表,=,函数名,(,输入形参表,),注释说明部分,函数体部分,.,例,:,利用函数文件实现直角坐标与极坐标之间的转换,.,函数文件,tran.m,function rho,theta=tran(x,y),rho=sqrt(x*x+y*y);,theta=atan(y/x);,(2),函数文件的调用,保证所建函数文件在搜索路径中,即可直接调用之,.,例,:,用,main1.m,调用,tran.m,x=input(please input x=);,y=input(please input y=);,rho,the=tran(x,y);,rho,the,作业,:P93 1,2,学习小组,:,三人一组,
展开阅读全文