《matlab语言编程.pdf》由会员分享,可在线阅读,更多相关《matlab语言编程.pdf(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第二章 第二章 MATLAB 语言编程语言编程 本书的主要内容是关于控制系统的分析、设计和仿真,用到的工具软件是 Matlab,因此熟悉和理解 Matlab 语言至关重要。本章把 Matlab 作为一种编程语言介绍给读者,主要介绍 MATLAB 的基础知识,包括数据类型、运算符、基本语句、矩阵、多项式等,同时还简要介绍了数据的可视化实现,为以后应用 Matlab 编写控制系统设计、仿真程序打下良好的基础。2.1 数据类型和运算符数据类型和运算符 2.1.1 变量、语句变量、语句 1、变量?变量命名规则 为变量(包括函数)命名时应该遵循以下的规则:必须以字母开头;可以由字母、数字和下划线混合组成
2、;变量长度应不大于 31 个;字母区分大小写。?变量的定义 Matlab 对于变量的定义和声明要求非常宽松,使用变量前不用专门的语句定义变量的数据类型,根据语句的执行结果自动指定变量的数据类型和变量的尺寸。?特殊变量 为了计算和使用方便,Matlab 中定义了一些具有特殊意义的变量(见表 2-1),这些特殊变量在工作空间和函数空间都可以使用。表 2-1 特殊变量定义表 变量名称 功能 变量名称 功能 ans 保存最后一次的运算结果pi 圆周率 realmax 最大的浮点数值 realmin 最小的浮点数值 I 虚数单位 j 虚数单位 Inf 正无穷大 NaN 非数(0/0,Inf/Inf)?局
3、部变量和全局变量 通常,每个函数体内都有自己定义的变量,不能从其它函数和 MATLAB 工作空间访问这些变量,这些变量就是局部变量。如果要使某个变量在几个函数中和 MATLAB 工作空间都能使用,可以把它定义为全局变量。全局变量用关键字“global”声明,如果需要在几个函数中和 MATLAB 工作空间都能 1访问一个全局变量,则必须在每个函数中和 MATLAB 工作空间都声明该变量为全局的。全局变量需要在函数体的变量赋值语句之前说明,整个函数以及对函数所有的递归调用都可以利用全局变量。2、基本语句 MATLAB 是一种解释性语言,它不仅可以在 MATLAB 命令窗口中键入命令,而且可以在编辑
4、器内编写应用程序,统一在 MATLAB 环境下运行处理,并返回运算结果。MATLAB 语言的基本语句结构为:变量名列表=表达式 其中等号左边的变量名列表为 MATLAB 语句的返回值,若一次返回多个结果,则变量列表用括起来,各变量间用逗号分隔;等号右边为表达式,可以是矩阵运算或函数调用,可以由分号(;)、逗号(,)或回车结束。如果用分号结束,则左边的变量结果将在屏幕上不显示,否则将显示左侧变量的值。2.1.2 数据类型数据类型 在MATLAB里共有六种数据类型,每一种类型可以是一维、二维和多维的。这六种是:双精度型(double)、字符型(char)、稀疏型(sparse)、存储型(stora
5、ge)、细胞型(cell)和结构型(struct)。MATLAB计算都采用双精度,MATLAB提供的绝大部分函数都是对双精度矩阵和字符串操作的,其他几种数据类型用于特殊的场合。比如存储型可用于图像处理,稀疏型用于稀疏矩阵,细胞型和结构型一般用于编写大型软件。表2-2列出了这些数据类型的一些例子。表2-2 数据类型举例 数据类型(class)举 例 解 释 double 1,2;3,4,5+6i 双精度数值类型,是最常用的类型。Char Hello 字符数组,每个字符占16位。sparse speye(5)双精度稀疏矩阵,只存储矩阵中的非0元素 Cell 1,2,3;4,5,6;7,8,9,he
6、llo,eye(2)细胞数组,数组中的每个元素可为不同类型、不同维数。struct a.day=12;a.color=red a.mat=magic(3)结构数组相当于数据库的记录,把相关的数据列在一起,称为属性,不同属性的数据类型可以不同 storage unit8(magic(3)8位型,为无符号整数,最大可表示255,不能进行数学运算。和其他软件不同,在MATLAB里,不能用double、char来定义变量。变量的数据类型可以用函数isa来查看,其调用格式为:isa(变量名,数据类型)比如:isa(s,sparse),当矩阵s为稀疏矩阵时将返回1。下面我们重点介绍字符型、结构型、细胞型数
7、据的使用规则和方法。1、字符字符 MATLAB 有强大的字符处理能力,其字符处理函数见附录 A 中的附表 A-2。MATLAB 中的字符串有几条基本规则:2所有字符串都用单引号括起来;字符串中的每一个字符都是该字符串变量中的一个元素;字符串中的字符以 ASC码形式存储,因而区分大小写。MATLAB 中对字符串的常用操作方法主要有:建立:可以直接赋值或者由其他数值转换得到,常用函数有 char、int2str、num2str、sprintf 等。连接:水平连接通过函数 strcat 或在中括号内用逗号连接;垂直连接通过函数strvcat 或在中括号内用分号连接。比较:常用函数 strcmp、st
8、rcmpi、strncmp,相同则返回 1,否则为 0。查找:常用函数 findstr。2、结构结构 MATLAB 中结构的概念与 C 语言中类似,也包含一个或多个域,每个域可以包含任何类型的数据,而且互相独立。结构的建立和访问有其特有的方法:直接建立结构和各个域,同时给各域赋值,结构和域之间用点“”连接。同样,访问结构的各个域时,其格式为:结构名域名 结构的各个域可以按照其本身的数据类型进行相应的各种运算。例 2-1:student.name=Jack;student.age=20;student.phone=2345678;用函数 struct 建立结构,其用法为:s=struct(fie
9、ld1,values1,field2,values2,)该函数用指定的域名和各个域的数据建立结构数组,如果数组中包含多个结构,而且各个结构域中的数据不尽相同,那么域的数据 values1、values2必须是细胞数组。例 2-2:%建立一个结构体数组,数组里现在有 2 个元素 s=struct(type,big,little,color,red,x,3 1)s(1).type s(2).x s(2).color%建立一个结构体数组,其中域 data 是细胞数组 a.data=Hello,3,2,3;0,1;a.memo=this is a test;a.data3 a.data1(1)a.me
10、mo(7)3、细胞细胞 细胞数组是MATLAB特有的一种数据类型。细胞数组的各个元素可以是不同的数据类型。细胞数组的访问采用下标访问,用 括起来的下标为细胞数组中的第几个元素,用()括起来的下标为大括号对应的某个元素的分量。可以用两种方法定义细胞数组:3(1)用赋值语句直接生成;例2-3:a(1,1)=1 4 3;0 5 8;2 3 5;a(1,2)=My cat;a(2,1)=4+6j;a(2,2)=0:1:10;也可以这样赋值:A1,1=1 4 3;0 5 8;2 3 5;A1,2=My cat;A2,1=4+6j;A2,2=0:1:10;(2)先用cell函数预分配数组,然后对每个元素赋
11、值。例2-4:B=cell(5,3);%将B定义为5x3的细胞数组 B(2,2)=1:0.1:1;2.1.3 运算符 2.1.3 运算符 MATLAB的运算符可分为三类:算术运算符、关系运算符和逻辑运算符。其中算术运算符的优先级最高,其次是关系运算符,再其次是逻辑运算符。下面将分别介绍这三类运算符和逻辑函数。1.算术运算符 1.算术运算符 按照运算符的优先级可把算术运算符分为五级,在每一级里运算符有同样的优先级,在运算时自左向右结合,常见的算术运算符见附录A中的附表A-2。.+-(标量加、减).*./.*/+-(矩阵加、减):(循环)算术运算符中带有.表示只对操作数的每个元素作相同的运算,例如
12、C=A.*B表示C中的每个元素等于A和B中相同位置元素的乘积,而C=A*B代表矩阵的乘积运算。2.关系运算符 2.关系运算符 关系运算符对于程序的流程控制非常有用,在MATLAB的循环和条件控制中经常使用。在MATLAB里共有六个关系运算符,这些运算符和C语言的运算符含义基本相同。大于 =大于等于=等于 =不等于 除了长方形矩阵和向量外,所有的关系运算符连接的两个运算数须是同维、每维同大小的。对于长方形矩阵和向量,两个运算符或者同维、同大小,或者其中一个为标量。当有一个运算数是标量时,关系运算符是把标量和另一个运算数的每个元素进行比较。关系运算符将生成一个0-1矩阵,当运算数相应元素为真时,对
13、应位置上生成1,否则为0。例2-5:a=-1,2;3,9;4a=1 运算结果:ans=0 1 1 1 3.逻辑运算符 3.逻辑运算符 MATLAB里共三种逻辑运算符:&(与)|(或)(非)和关系运算符一样,除了逻辑运算符的一个运算数为长方阵或向量时,另一个运算数可以为标量。其余情况下均要求矩阵同维。逻辑运算符也对运算数的相应元素一一运算,最后结果是一个0-1矩阵。当逻辑表达式的值为真时,赋值1,否则为0。对于数值矩阵,当元素为0时,逻辑上为假;当元素为非0时,逻辑上为真。4.逻辑函数 4.逻辑函数 MATLAB提供了一些逻辑函数。主要包括xor(异或)、all、any、isnan、isinf、
14、isfinite、find等等。(1)all函数:当向量的元素都为真时,函数all将返回变量1,否则返回变量0。对于矩阵,函数all对列操作。当某列的元素都为真时,返回值为1。函数all对于矩阵的最终运算结果为一个0-1行向量。(2)any函数:当向量中至少有一个元素为真时,函数any将返回变量1;只有当向量中的所有元素都为假时才返回变量0。和函数all一样,当运算数为矩阵时,函数any将逐列运算,最后返回一个结果为0-1的行向量。(3)函数isnan、isinf和isfinite:返回和运算数同维的数组。当运算数为NaN(非数)时,函数isnan在返回数组的位置为1,否则返回0。当运算数的元
15、素为inf(无穷大)时,函数isinf在返回数组的相应位置为1。否则为0。当运算数的元素不为inf和NaN时,函数isfinite在相应的位置返回1,否则返回0。下面的程序段给出了计算实例。例2-6:A=0 1 5;2 NaN inf;B=0 0 15;2 5 inf;C=A./B Warning:Divide by zero.C=NaN Inf 0.3333 1.0000 NaN NaN isfinite(C)ans=0 0 1 1 0 0 isnan(C)ans=1 0 0 0 1 1 isinf(C)ans=0 1 0 0 0 0(4)find函数:用于查找向量中的真元素的下标,返回由所
16、有真元素下标构成的列 5向量。对于数值向量,真元素即为非0元素。下面的程序段给出了它的用法。例2-7:A=magic(3)生成三阶魔方矩阵。A=8 1 6 3 5 7 4 9 2 i=find(A5)%查找A5生成的0-1矩阵中的非0元素,并将非0元素在矩阵中的一维下标生成列向量i i=1 6 7 8 A(i)=1000 将魔方矩阵中下标为i的元素赋值为1000。A=1000 1 1000 3 5 1000 4 1000 2 2.2 程序控制语句程序控制语句 和其它高级语言一样,MATLAB 也提供了循环语句、条件转移语句等一些常用的控制语句,而且与 C 语言的控制语句格式很相似。1、循环语句
17、、循环语句 MATLAB 中的循环语句包括 for 循环和 while 循环两种类型。?for 循环 for 循环的基本格式为:for 循环变量=起始值:步长:终止值 循环体 end 步长的缺省值是 1。步长可以在正实数或负实数范围内任意指定,对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束?while 循环 while 循环的基本格式为:while 表达式 循环体 end 其执行方式为:若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,若为假则跳出循环体,向下继续执行,否则继续执行循环体。?break:从循环体中跳出,并使循环结束。2、条
18、件转移语句、条件转移语句 条件转移语句有 if 语句和 switch 语句两种 6?ifelseelseif 语句 i.if 格式:if 逻辑表达式 执行语句 end 当逻辑表达式的值为真,则执行该结构中的执行语句内容,执行完后向下继续执行,若逻辑表达式的值为假,跳过结构中的执行语句继续向下执行。ii.if-else 格式 if 逻辑表达式 执行语句 1 else 执行语句 2 end 如果逻辑表达式的值为真,则执行语句 1,然后跳过语句 2 向下执行;若逻辑表达式的值为假,则跳过执行语句 1 而执行语句 2,然后向下执行。iii.if-elseif 格式 if 逻辑表达式 1 执行语句 1
19、elseif 逻辑表达式 2 执行语句 2 else 逻辑表达式 n 执行语句 n else 执行语句 el end 如果逻辑表达式的值为真,则执行语句 1,若逻辑表达式的值为假,则判断逻辑表达式 2 的值,若为真,则执行语句 2,否则向下执行。?switch 语句 switch 语句的格式为:switch 表达式(标量或字符串)case 值 1 语句 1 case 值 2 语句 2 case 值 n 语句 n otherwise 7 语句 ow end 其执行方式为:表达式的值和哪种情况(case)的值相同,就执行哪种情况中的语句,如果都不同,则执行 otherwise 中的语句。2.3 矩
20、阵运算矩阵运算 2.3.1 输入简单的矩阵输入简单的矩阵 在 MATLAB 语言中不必描述矩阵的维数和类型,它们是由输入的格式和内容来决定的。输入小矩阵最简单的方法是使用直接排列的形式,把矩阵的元素直接排列到方括号中。每行内的元素间用空格(space)或逗号(,)分开,行与行的内容间用分号(;)隔开。例如 2-8:A=1 2 3;4 5 6;7 8 9 或 A=1,2,3;4,5,6;7,8,9 都将得到输出结果:A 1 2 3 4 5 6 7 8 9 大的矩阵可以分行输入,用回车键代替分号。这样的输入形式更接近于我们平时使用矩阵的数学格式。如:A=1 2 3 4 5 6 7 8 9 矩阵的输
21、入也可以通过建立 M 文件来完成,还可以通过函数的输出变量赋值建立。向量和标量也可以看成是一种特殊的矩阵。2.3.2 矩阵元素与下标引用矩阵元素与下标引用 1.矩阵下标 1.矩阵下标 在MATLAB中,矩阵元素的引用可以通过下标表示,通常有如下规则:?用两个下标来表示。在矩阵A中,第i行j列的元素用A(i,j)来表示。?用一个下标来表示。对于矩阵,由于MATLAB的基本运算都是对列操作的,矩阵认为是按列优先排列的一个长的列向量,从而可用单下标引用。例如:对于22的矩阵A,其中A(1)表示第一列的第一个元素,A(2)表示第一列的第二个元素,A(3)表示第二列的第一个元素,A(4)表示第二列的第二
22、个元素。?在下标的表达式里使用冒号表示矩阵的一部分。例如:A(1:k,j)表示矩阵A的第j列的前k个元素。A(:,j)表示矩阵A的第j列的所有元素。由于有了冒号运算符,在MATLAB里编程变得特别简洁,例如求矩阵A的第j列元素之和,其表达式为sum(A(:,j))。?下标引用从序号1开始。2.矩阵的组合 2.矩阵的组合 在MATLAB里,矩阵的组合表示把小矩阵组合成大矩阵。矩阵的组合符号为中括号。例2-9:A=1,2;3,4,B=A,A+100 A=1 2 3 4 B=1 2 101 102 8 3 4 103 104 3矩阵的抽取 3矩阵的抽取 用下标可以从大矩阵里面抽取某些元素组成小的矩阵
23、,并使用()运算符。例 2-10:A=1,2,3;4,5,6;7,8,9;C=A;10,11,12,D=C(1:3,:)C1 2 3 4 5 6 7 8 9 10 11 12 D1 2 3 4 5 6 7 8 9 4.删除矩阵的行和列 4.删除矩阵的行和列 我们把空的称为空矩阵,即矩阵大小为00。可以通过把矩阵的行或列赋值为空矩阵来删除某行或某列。例2-11:X%将一个00的矩阵赋给X A(:,2 4)=%则将A的第二列和第四列删除了 A(:,2)=%删除矩阵A的第二列 在MATLAB里不能用双下标来删除矩阵的某个元素,例如X(1,2)=将给出错误信息。但可以用单下标来删除矩阵的某个或某些元素
24、,MATLAB删除这些元素后,将剩下的元素按列编成一个长的行向量。例2-12:A=1 2 3;4 5 6;A(2:2:6)=删除下标为2,4,6的三个元素 运行结果:A1 2 3 2.3.3矩阵运算 2.3.3矩阵运算 1矩阵的加减矩阵的加减 矩阵地加减运算使用、运算符,能够相加减的矩阵满足以下两个条件之一:(1)类型相同,即行数相等,且列数相等。(2)其中一个为标量,此时的加减运算结果等于矩阵中每一个元素都和标量做加减运算。例 2-13:x=1 0 2;y=x-1 运算结果:y=0 -1 1 2 矩阵的乘积 2 矩阵的乘积 矩阵的乘积运算使用*运算符,而且相乘的矩阵必须满足维数条件。例 2-
25、14:v=3 1 4;u=2;0;-1;x=v*u%可求出内积。x=2 X=u*v%可求出外积。X=6 2 8 9 0 0 0 -3 -1 -4 3矩阵的除法矩阵的除法 MATLAB 定义的除法运算其意义相当于矩阵的求逆运算。更一般地,MATLAB 还定义了矩阵的左除及右除。矩阵的左除:MATLAB 用“”运算符号表示两个矩阵的左除,AB 即由 Gauss 消去法来获得线性方程 AXB 的解 X,即 XA-1B。如果矩阵不是方阵,也可以求出 AB,这时将使用最小二乘法来求取 AXB 中的 X 矩阵。矩阵的右除:MATLAB 用“/”表示两个矩阵的右除。X=B/A 是 X*A=B 的解,对于非奇
26、异方阵 A,B/A 等效为 BA-1。4矩阵的转置矩阵的转置 在 MATLAB 里,单引号表示复共轭转置,一个点加单引号.表示普通转置。例 2-15:z=1+2i 3+4i,z,z.运算结果:z=1+2i 3+4i z=1-2i 3-4i z.=1+2i 3+4i 5矩阵的点运算矩阵的点运算 MATLAB 中定义了一种特殊的运算,即点运算。两个矩阵之间的点运算是对该矩阵对应元素的直接运算。例如 C=A.*B 表示 A 和 B 矩阵的相应元素之间直接进行乘法运算,然后将结果赋给 C 矩阵。注意,点乘积运算要求 A 和 B 矩阵的维数相同。这种点乘积又称为 Hadamard 乘积。常用的点运算包括
27、:.*,./,.,.,.。例 2-16:对两个简单矩阵 A 和 B=087654321A,=098765432B普通乘法运算与点乘运算结果分别为:=846954519681184236AB,=072564230201262*.BA2.3.4 矩阵函数矩阵函数 1、三角分解三角分解 矩阵最基本的分解是将一个方阵表示成两个基本三角阵的乘积,其中一个三角阵为上三角阵,另一个为下三角阵。这种分解被称为LU 分解。利用这种分解,可以求矩阵的逆,行列式的值,它也是解线性方程的基础,或者是方阵除法的基础。Matlab 提供如下函 10数:L,U=lu(A)%求矩阵 A 的 LU 分解 Xinv(A)%求矩阵
28、 A 的逆矩阵 d=det(A)%求矩阵 A 的行列式 2、特征值分解、特征值分解 对于求解 A 矩阵的特征值和特征向量,其调用格式为:deig(A);V,Deig(A);V,Deig(A,nobalance)其中 A 为方阵,且它的线性独立的特征向量个数等于矩阵 A 的阶数,d 为矩阵 A 的特征值向量;D 为 A 阵的特征值对角阵,V 为 A 阵的全部右特征向量,且满足 A*V=V*D的特征向量矩阵;当 A 矩阵中有的元素小到和截断误差相当时,用 nobanlance 选项。当 A矩阵来自程序的中间计算结果时,一般用 nobalance 选项来减少计算误差。4、矩阵的尺寸矩阵的尺寸 为了判
29、断矩阵的尺寸,Matlab 提供了以下函数:m,n=size(A)%返回矩阵的行数 m 和列数 n M=size(A)%在矩阵 M 中返回矩阵的行数、列数 len=length(A)%返回矩阵 A 行数和列数中的最大值 5、特殊矩阵的生成特殊矩阵的生成 在实际应用中经常要用到一些特殊矩阵,Matlab 为我们提供了这些函数:?单位矩阵 eys(n)%生成 n 维单位阵 eye(m,n)%生成 mn 的单位阵 eys(m,n)%生成 mn 的单位阵 eye(size(A)%生成与 A 矩阵同样大小的单位矩阵?全 1 矩阵 ones(n)ones(m,n)ones(m,n)ones(size(A)
30、?全零矩阵 zeros(n)zeros(m,n)zeros(m,n)zeros(size(A)?随机矩阵 rand(n)rand(m,n)rand(m,n)rand(size(A)生成的随机矩阵的各个元素值在 0 和 1 之间。?魔术矩阵 magic(n)魔术矩阵的所有行元素和、列元素和、对角线元素和均相等。2.4 多项式多项式 在 MATLAB 里,多项式用行向量表示。多项式 P(x)=an xn+an-1xn-1+a1x+a0。11其系数向量表示为:Pan an-1 a1 a0。2.4.1 多项式的创建多项式的创建?直接输入法 例如:P=1,2,3,4?poly(A)创建方阵 A 的特征多
31、项式?poly(a)如果 A 为向量bn bn-1b1 b0,则创建(x-b0)(x-b1)(x-bn-1)(x-bn)生成的多项式的系数向量。2.4.2 多项式的常用函数多项式的常用函数 多项式的函数包括:roots:%求多项式的根。poly:%求矩阵的特征多项式。polyval:%求多项式的自变量为某个特定值(标量)时的多项式的值。polyvalm:%和 polyval 作用相同,输入参数值也可为方阵。当多项式的变量为矩阵时,其意义和标量差不多。例如,多项式 P(s)x3-2x-4,则 P(A)A3-2A-4I,I 为和 A 同阶的单位阵。例 2-17:p=1 0 2-4;r=roots(
32、p)r2.00 -1.00+1.00i-1.00-1.00i A=1.2 3 5 0.9;5 1.7 5 6;3 9 0 1;1 2 3 4;poly(A)求矩阵 A 的特征多项式 ans=1.0000-6.9000 77.2600-86.1300 604.5500 polyval(ans,20)%求特征多项式中自变量为 20 时的值 ans=7.2778e+004 Y=polyvalm(p,A)%把矩阵作为自变量代入到多项式中 Y408.6880 454.0300 512.2400 494.7260 605.2500 777.3130 673.0500 695.5900 434.7200 8
33、63.9100 557.6000 506.2400 346.9400 445.7800 417.7000 412.7800 2.4.3 卷积和解卷积卷积和解卷积 卷积和解卷积是信号处理中常用的数学工具。向量的卷积和解卷积对应于多项式的乘法和除法,其常用函数包括:conv:%卷积函数,多项式乘法函数 deconv:%解卷积函数,多项式除法函数 polyder:%用于计算两个多项式的积、单个多项式和两个多项式的商的导数,其调用格式为:12?Pdpolyder(P)%求多项式 P 的导数?Pmpolyder(P1,P1)%求多项式 P1 和多项式 P2 的乘积的导数?Q,D=polyder(P1,P
34、2)%求多项式 P1 除以多项式 P2 商的导数 例 2-18:a=1 2 3;b=4 5 6;c=conv(a,b)求多项式 a(s)和 b(s)的乘积 c=4 13 28 27 18 q,r=deconv(c,a);q 利用多项式除法求出多项式 b(s)q=4 5 6 q=polyder(c)q=16 39 56 27%求多项式 c(s)的导数 2.4.4 多项式曲线的拟合多项式曲线的拟合 从最小二乘的意义上,polyfit 函数将拟合出所给数据的多项式系数,其调用格式为:p=polyfit(x,y,n)其中,x 和 y 为已知数据的横坐标和纵坐标向量,n 为多项式的次数。例 2-19:已
35、知五个数据点:1,5.5,2,43,3,128,4,290,5,498,试画出这五个点拟合的三次曲线。解:运行下面的程序,并得到相应的拟合的曲线如图 21 所示。x=1,2,3,4,5;y=5.5,43,128,290,498;p=polyfit(x,y,3)p=-0.1250 30.9821-58.8929 34.4000 x2=1:0.1:5;y2=polyval(p,x2);plot(x,y,o,x2,y2),grid on 图 21 多项式曲线拟合 2.5 函数与函数与 M 文件文件 和其它高级语言一样,函数是 MATLAB 语言中最重要的组成部分,MATLAB 提供的各种工具箱中的
36、M 文件几乎都是以函数的形式给出的。用 Matlab 语言编写的可以在 Matlab 环境中运行的程序称为 M 文件。M 文件用扩展 13名.m 结尾,可在命令行中执行,也可被其它程序调用,我们可以使用任何文本编辑器编辑M 文件。M 文件分为两种:命令文件和函数文件,它们有各自的特点。2.5.1 命令文件命令文件 命令文件没有输入参数也没有输出参数,只是一些 Matlab 命令和函数的组合。命令文件可以操作工作空间的变量,也可以生成新的变量,但是当命令文件执行结束后新变量将保存在工作空间中,不会被自动清除。例 2-20:编写命令文件 test_com.m,用于求解小于 2000 且为 2 的整
37、数次幂的正整数。解:%test_com.m F(1)=2;k=1;while F(k)1000 F(k+1)=2*F(k);k=k+1;end F,k 为了能够在命令窗口执行 test_com 命令,可以建立一个 MySample 子目录,然后用命令窗口的【File】|【Set Path】菜单将该目录加入的 Matlab 的搜索目录中。这样就可以直接在 Matlab 命令窗口键入 test_com 执行这个命令,其运行结果为:F=Columns 1 through 6 2 4 8 16 32 64 Columns 7 through 10 128 256 512 1024 k=10 2.5.2
38、 函数文件 2.5.2 函数文件 函数接收输入参数,返回输出参数。函数文件与程序文件类似也是以“.m”为扩展名的文本文件,而程序文件与函数文件的主要区别在于,函数允许通过数值进行参数传递,而且函数使用局部变量而不是全局变量操作。另外函数文件的第一行必须包括“function”这个关键字。函数文件的文件名必须和函数定义的函数名称相同。MATLAB 的函数 M 文件通常由以下几个部分组成:?函数定义行 函数 M 文件的第一行用关键字“function”把 M 文件定义为一个函数,并指定它的名字,并且与文件名必须相同,同时定义了函数的输入和输入参数。输入参数的定义用小括号(),如果有多个输入参数则用
39、逗号分隔;输出参数的定义用中括号,如果有多个输出参数则用逗号分隔。?H1 行 所谓 H1 行指帮助文本的第一行,它紧跟在定义行之后并以“%”符号开头,用于概括说明函数名和函数的功能。在命令窗口用 lookfor 命令时将显示所寻求函数的 H1 行。?函数帮助文本 14帮助文本指位于 H1 行之后函数体之前的说明文本,它同样以“%”符号开头,一般用来比较详细地介绍函数的功能和用法。在命令窗口用 help 命令时将显示函数的 H1 行和所有帮助文本。?函数体 是函数的主体部分,包括进行运行和赋值操作的所有 MATLAB 程序代码,其中可以有流程控制、输入输出、计算、赋值、注释以及函数调用等操作。?
40、注释 除了函数开始独立的帮助文本外,还可以在函数体中添加对语句的注释。注释必须以“%”符号开头,MATLAB 在编译执行 M 文件时把每一行中“%”后面的全部内容作为注释不进行编译。2.5.3 子函数子函数 一个 M 文件中可以定义多个函数,其中第一个定义的函数称为主函数,主函数名必须与 M 文件名相同,其它函数称为子函数。子函数只能被定义它的文件中的函数调用,其它函数和文件不能调用。2.5.4 局部函数局部函数 把一些文件放在 private 目录下,那么这些文件中定义的函数就是局部函数。局部函数只能被其父母目录中的函数或文件调用,其它函数和文件无权调用。2.5.5M 文件的执行文件的执行
41、当 Matlab 遇到一个新的名称(命令、函数、变量)时,按如下次序查找这个名称:(1)当前的工作空间;(2)子函数名称;(3)局部函数名称;(4)set path 指定的路径。要想使自己编写的函数或命令能够在命令窗口自由的使用,一个比较好的处理方法是建立一个目录,并把这个目录加到 Set Path 指定的目录中,将自己编写的 M 文件都存放到这个目录中。本书中的例子和附录中的程序都可以采用这种方法处理。例 2-21:编写函数求。=nkk1!解:function r=AddJc(n)%AddJc.m 函数 AddJc(n)求 1 到 n 的阶乘的和%n 为输入参数,Jc 为子函数 r=0;k=
42、1;while k=n r=r+Jc(k);k=k+1;end%Jc(m)求解 m 的阶乘,是文件内部函数(子函数)function s=Jc(m)15 s=1;k=1;while k 大于号 小于号 o 小圆圈*星号.小黑点 x 叉号 pentagram 五角星 square 小正方形 hexagram 六角星 diamond 菱形 none 无标记 例如:plot(x,y,y:square),字符串“y:square”表示用黄色点划线和正方形点标记绘制曲线。2.坐标轴控制坐标轴控制 a)axis(xmin,xmax,ymin,ymax)指定轴的显示范围,四个输入参数分别为横轴显示的最小值和
43、最大值、纵轴显的最小值和最大值,可以用Inf和-Inf表示。b)axis square 一般情况下,MATLAB给出的图形窗口不是正方形,所有显示的图形区域也不是正方形。对应两轴的比例,一般也是不相等的。可以用此命令指定两轴的显示的长度相同。c)axis tight 用于绘制指定数据的范围。“equal”和“tight”也可以同时选中。d)axis equal 用于指定两轴的显示比例相同。e)set(gca,xtick,),set(gca,ytick,)设置横轴(X轴)、纵轴(Y轴)的刻度线,第三个输入参数是一个刻度向量,并按照等分升序原则排列。3.删格控制删格控制 控制图形窗口的栅格是否被显
44、示。grid on%显示栅格 grid off%隐藏栅格 4.追加控制追加控制 控制绘图方式,即在当前窗口绘图时是否清除窗口上原来的的图形。hold on%绘图时不清除绘图窗口中原有的图形 hold off%绘图时清除绘图窗口中原有的所有图形 5.标注控制标注控制 在图形上加上适当的文字说明。?xlable(string,FontSize,zize),ylable(string,FontSize,zize)显示坐标轴的名称,string为坐标轴名称字符串,size为使用的字体尺寸。19?title(string,FontSize,size)显示整个图形的标题,string为标题字符串,size
45、为字体大小。?text(x,y,stirng)在绘图窗口的坐标(x,y)处显示字符串string。例2-24:运行下面的程序,并得到如图2-5所示图形。x=-pi:0.02*pi:pi;plot(x,cos(x);xlabel(x=-pi pi,FontSize,16)ylabel(cos(x),FontSize,16)title(Value of the Cosine)text(3*pi/4,cos(3*pi/4),leftarrowcos(x)=-.707)text(-pi/2,cos(pi/2),leftarrowcos(x)=0)text(pi/4,cos(pi/4),cos(x)=0
46、.707rightarrow,HorizontalAlignment,right)-4-3-2-101234-1-0.8-0.6-0.4-0.200.20.40.60.81x=-cos(x)Value of the Cosinecos(x)=-.707cos(x)=0cos(x)=0.707 图2-5 图形标注控制 小小 结结 本章简单介绍了MATLAB语言的基本使用方法,包括数据类型、编程语句、函数使用、矩阵和多项式、二维图形的绘制等内容,至于数值计算和数据可视化方面的更为复杂的一些函数,例如数据的三维的图形表现、图形的色彩、光线、视角等的控制,可以参考书后的附录或者依靠帮助系统获得。习习 题题 2.1编制函数,求二次方程的根并求出方程x253.99x-0.054=0的根 2.2已知矩阵A1,2,3;4,5,6;7,8,9,求A的逆矩阵、特征值、行列式的值。2.3求矩阵A2,3,4;1,1,9;1,2,-6的LU分解。2.4在同一图形窗口分别绘制0,4区间上的x110sint,x26|sin2t|t 曲线。2.5编制程序,计算12+n2000时的最大n值。4 分别用for和while循环结构编写程序,求出K。=6302ii 20 21