CH2、 MATLAB运行环境及程序设计 第一节 MATLAB的窗口环境 一、MATLAB语言的显著特点 1、具有强大的矩阵运算能力:Matrix Laboratory (矩阵实验室),使得矩阵运算非常简单。 2、是一种演算式语言 ? MATLAB的基本数据单元是既不需要指定维数, 也不需要说明数据类型的矩阵(向量和标量为矩 阵的特例),而且数学表达式和运算规则与通常 的习惯相同。 因此MATLAB语言编程简单,使用方便。 3. 启动与退出 ? 启动 双击系统桌面的MATLAB图标启动 开始菜单的选项中选择MATLAB快捷方式启动 双击MATLAB的安装路径的bin子中的Matlab可执行文件 ? 退出 在MATLAB主窗口File菜单中选择Exit MATLAB Quit或者Exit命令 单击主窗口的关闭按钮 4. MATLAB桌面平台 ? 桌面平台 (1) Matlab主窗口 (2)命令窗口 ( Command Windows ) (3)历史窗口 ( Command History ) (4)当前目录窗口 ( Current Directory ) (5)发行说明书窗口(Launch Pad) (6)工作间管理窗口 ? 主窗口 MATLAB主窗口是MATLAB的主要工作界 面。主窗口除了嵌入一些子窗口外,还主要 包括菜单栏和工具栏。 1.菜单栏 在MATLAB 6.5主窗口的菜单栏,共包含 File、Edit、View、Web、Window和Help 6 个菜单项。 ? (1) File菜单项:File菜单项实现有关文件的 操作。 (2) Edit菜单项:Edit菜单项用于命令窗口的 编辑操作。 (3) View菜单项:View菜单项用于设置 MATLAB集成环境的显示方式。 ? (4) Web菜单项:Web菜单项用于设置 MATLAB的Web操作。 (5) Window菜单项:主窗口菜单栏上的 Window菜单,只包含一个子菜单Close all, 用于关闭所有打开的编辑器窗口,包括Mfile、Figure、Model和GUI窗口。 (6) Help菜单项:Help菜单项用于提供帮助 信息。 ? 工具栏 MATLAB 6.5主窗口的工具栏共提供了10个 命令按钮。这些命令按钮均有对应的菜单命 令,但比菜单命令使用起来更快捷、方便。 ? 2.4.1 命令窗口 命令窗口是MATLAB的主要交互窗口,用 于输入命令并显示除图形以外的所有执行结 果。 MATLAB命令窗口中的“>>”为命令提示符 ,表示MATLAB正在处于准备状态。在命 令提示符后键入命令并按下回车键后, MATLAB就会解释执行所输入的命令,并 在命令后面给出计算结果。 ? 一般来说,一个命令行输入一条命令,命令 行以回车结束。但一个命令行也可以输入若 干条命令,各命令之间以逗号分隔,若前一 命令后带有分号,则逗号可以省略。例如 p=15,m=35 p=15;m=35 ? 如果一个命令行很长,一个物理行之内写不 下,可以在第一个物理行之后加上3个小黑 点并按下回车键,然后接着下一个物理行继 续写命令的其他部分。3个小黑点称为续行 符,即把下面的物理行看作该行的逻辑继续。 在MATLAB里,有很多的控制键和方向键 可用于命令行的编辑。(参考P18) ? 2.4.2 工作空间窗口 工作空间是MATLAB用于存储各种变量和 结果的内存空间。在该窗口中显示工作空间 中所有变量的名称、大小、字节数和变量类 型说明,可对变量进行观察、编辑、保存和 删除。 2.4.3 内存变量的管理 1.内存变量的删除与修改 MATLAB工作空间窗口专门用于内存变量 的管理。在工作空间窗口中可以显示所有 内存变量的属性。当选中某些变量后,再 单击Delete按钮,就能删除这些变量。当 选中某些变量后,再单击Open按钮,将进 入变量编辑器。通过变量编辑器可以直接 观察变量中的具体元素,也可修改变量中 的具体元素。 clear命令用于删除MATLAB工作空间中的变 量。who和whos这两个命令用于显示在 MATLAB工作空间中已经驻留的变量名清 单。who命令只显示出驻留变量的名称, whos在给出变量名的同时,还给出它们的大 小、所占字节数及数据类型等信息。 获取工作空间信息 who 显示工作空间中所存的变量名. whos 显示工作空间中各变量的属性(它包括大小 元素个数,所占用的字节数;元素精度 退出和保存工作空间 – 退出: quit或exit – 保存: save <文件名> [<变量名列表>] 文件名扩展名为 “mat‖ – 装入: load <文件名> [<变量名列表>] – 清除: clear 清除所有的变量 clear <变量名列表> 清除指定的变量,变量名之间用 空格隔开 ? 2.4.4 当前目录窗口和搜索路径 1.当前目录窗口 当前目录是指MATLAB运行文件时的工作目录, 只有在当前目录或搜索路径下的文件、函数可 以被运行或调用。 在当前目录窗口中可以显示或改变当前目录, 还可以显示当前目录下的文件并提供搜索功能。 将用户目录设置成当前目录也可使用cd命令。 例如,将用户目录c:\mydir设置为当前目录, 可在命令窗口输入命令: cd c:\mydir ? 2.MATLAB的搜索路径 当用户在MATLAB命令窗口输入一条命令 后,MATLAB按照一定次序寻找相关的文 件。基本的搜索过程是: (1) 检查该命令是不是一个变量。 (2) 检查该命令是不是一个内部函数。 (3) 检查该命令是否当前目录下的M文件。 (4) 检查该命令是否MATLAB搜索路径中其 他目录下的M文件。 ? 用户可以将自己的工作目录列入MATLAB搜索路径,从而将 用户目录纳入MATLAB系统统一管理。设置搜索路径的方法 有: (1) 用path命令设置搜索路径。例如,将用户目录c:\mydir加到 搜索路径下,可在命令窗口输入命令: path(path,?c:\mydir?) ? path 显示当前的MATLAB搜索路径 ? path(?目录路径描述’,path ) 将指定路径加到原有搜索路径 之前;path (path,?目录路径描述’, ) 将指定路径加到原有搜 索路径之后 ? 如:path(?c:\user?,path ) 将指定c:\user加到原有搜索路径之前 ? genpath:在命令窗口中输入这个命令可以得到由MATLAB所 有搜索路径连接而成的一个长字符串. ? (2) 用对话框设置搜索路径 在MATLAB的File菜单中选Set Path命令或 在命令窗口执行pathtool或者editpath命令, 将出现搜索路径设置对话框。通过Add Folder或Add with Subfolder命令按钮将指定 路径添加到搜索路径列表中。 在修改完搜索路径后,则需要保存搜索路径。 ? (3)使用addpath命令扩展目录 若要把新目录加到整个搜索路径的尾末,则使 用如下命令: addpath e:\myfiles _end 若要把新目录加到整个搜索路径的开始,则使 用如下命令: addpath e:\myfiles _begin ? 2.4.5 命令历史记录窗口 在默认设置下,历史记录窗口中会自动保留 自安装起所有用过的命令的历史记录,并且 还标明了使用时间,从而方便用户查询。而 且,通过双击命令可进行历史命令的再运行。 如果要清除这些历史记录,可以选择Edit菜 单中的Clear Command History命令。 ? 2.4.6 启动平台窗口和Start按钮 MATLAB 6.5的启动平台窗口可以帮助用户方 便地打开和调用MATLAB的各种程序、函数和 帮助文件。 MATLAB 6.5主窗口左下角还有一个Start按钮, 单击该按钮会弹出一个菜单,选择其中的命令 可以执行MATLAB产品的各种工具,并且可以 查阅MATLAB包含的各种资源。 2.4 MATLAB帮助系统 2.4.1 帮助窗口 进入帮助窗口可以通过以下3种方法: (1) 单击MATLAB主窗口工具栏中的Help按钮 “ ?”按钮。 (2) 在命令窗口中输入helpwin、helpdesk或doc。 (3) “help” 下拉菜单的前四项中的任何一项。 比如选择Help菜单中的“MATLAB Help”选项 ? 2.4.2 命令窗口查询系列帮助命令 MATLAB帮助命令包括help、lookfor以及模糊 查询。 1.help命令 在MATLAB 6.5命令窗口中直接输入help命令 将会显示当前帮助系统中所包含的所有项目, 即搜索路径中所有的目录名称。同样,可以通 过help加函数名来显示该函数的帮助说明。 ? Help系列 help:将显示当前的帮助系统中所包含的所有项 目,即搜索路径中的所有目录名称 help 函数类名 例如:help matfun help 函数名 例如:help inv ? 2.lookfor命令 help命令只搜索出那些关键字完全匹配的结 果,lookfor命令对搜索范围内的M文件进行 关键字搜索,条件比较宽松。 lookfor命令只对M文件的第一行进行关键字 搜索。若在lookfor命令加上-all选项,则可 对M文件进行全文搜索。 ? Lookfor函数: 当知道函数名而不知其用法时,Help命令帮助用户 准确地了解函数的用法,当查找不知其确切名称的 函数名时,可以用Lookfor命令查询根据用户提供的 关键字搜索到的函数。 其他的帮助命令 exist: 变量检验函数 what:目录中文件列表 who:内存变量列表 whos:内存变量详细信息 which:确定文件位置 ? ? 3.模糊查询 MATLAB 6.0以上的版本提供了一种类似模 糊查询的命令查询方法,用户只需要输入命 令的前几个字母,然后按Tab键,系统就会 列出所有以这几个字母开头的命令。 ? 2.4.3 演示系统 在帮助窗口中选择演示系统(Demos)选项卡, 然后在其中选择相应的演示模块,或者在命 令窗口输入Demos或者Demo,或者选择主 窗口Help菜单中的Demos子菜单,打开演示 系统。 ? 2.4.4 远程帮助系统 在MathWorks公司的主页 (http://www.mathworks.com)上可以找到很 多有用的信息,国内的一些网站也有丰富的 信息资源。 ? 联机查询 (1) 基本窗口介绍 (2) 演示界面 ? 常用的命令和技巧 Cd 改变当前目录 Clear 清除内存中的所有变量和函数 Clc 擦除matlab工作窗口中所有显示的内容 Clf 擦除matlab当前窗口中的图形 Dir 列出指定目录下的文件和子目录清单 Disp 在运行中显示变量或文字内容 ? 2.4.5 初识MATLAB 例1 绘制正弦曲线和余弦曲线。 x=[0:0.5:360]*pi/180; plot(x,sin(x),x,cos(x)); ? 例2 求方程 3x4+7x3 +9x2-23=0的全部根。 p=[3,7,9,0,-23]; %建立多项式系数向量 x=roots(p) %求根 第三节 变量、表达式及运算符 1、启动MATLAB命令窗口 ? 计算机安装好MATLAB之后,双击MATLAB图标,就可以进入 命令窗口,此时意味着系统处于准备接受命令的状态,可 以在命令窗口中直接输入命令语句。 ? MATLAB语句形式 变量=表达式; 通过等于符号将表达式的值赋予变量。当键入回车键时, 该语句被执行。语句执行之后,窗口自动显示出语句执行 的结果。如果希望结果不被显示,则只要在语句之后加上 一个分号(;)即可。此时尽管结果没有显示,但它依然 被赋值并在MATLAB工作空间中分配了内存。 2、命令行编辑器 (1)方向键和控制键可以编辑修改已输入的命令 :回调上一行命令 :回调下一行命令(参考 P18) (2)命令窗口的分页输出 ? more off:不允许分页 more on:允许分页 ? more(n):指定每页输出的行数 ? 回车前进一行,空格键显示下一页,q结束当前显 示。 (3)多行命令(…) ? 如果命令语句超过一行或者太长希望分行输入,则 可以使用多行命令继续输入。 ? S=1-12+13+4+… 9-4-18; 三、变量和数值显示格式 1、变量 (1)变量的命名:变量的名字必须以字母开头(不能 超过31个字符),之后可以是任意字母、数字或下 划线;变量名称区分字母的大小写;变量中不能包 含有标点符号。 (2)一些特殊的变量 在MATLAB工作空间中,还驻留几个由系统本身定 义的变量。例如,用pi表示圆周率π的近似值,用i, j表示虚数单位。 预定义变量有特定的含义,在使用时,应尽量避免 对这些变量重新赋值。 ans:用于结果的缺省变量名 i、j:虚数单位 pi:圆周率 nargin:函数的输入变量个数 eps:计算机的最小数 nargout:函数的输出变量 个数 inf:无穷大 realmin:最小正实数 realmax:最大正实数 nan:不定量 flops:浮点运算数 (3)变量操作 ? 在命令窗口中,同时存储着输入的命令和创建的所 有变量值,它们可以在任何需要的时候被调用。如 要察看变量a的值,只需要在命令窗口中输入变量 的名称即可:》a 2、数值显示格式 ? 任何MATLAB的语句的执行结果都可以在屏幕上显示, 同时赋值给指定的变量,没有指定变量时,赋值给 一个特殊的变量ans,数据的显示格式由format命 令控制。 ? format只是影响结果的显示,不影响其计算与存储; MATLAB总是以双字长浮点数(双精度)来执行所有 的运算。 ? 如果结果为整数,则显示没有小数;如果结果不是 整数,则输出形式有: format (short):短格式(5位定点数)99.1253 format long:长格式(15位定点数 99.12345678900000 format short e:短格式e方式 9.9123e+001 format long e:长格式e方式 9.912345678900000e+001 format bank:2位十进制 99.12 format hex:十六进制格式 format rat :近似有理数表示 MATLAB的基本数据结构 MATLAB的基本数据结构是矩阵。矩阵的创 建是:将矩阵的元素用方括号括起来,按矩 阵行的顺序输入各元素,同一行的各元素之 间用空格或逗号分隔,不同行的元素之间用 分号分隔。 字符串 在MATLAB中,字符串是用单撇号括起来的 字符序列。 MATLAB将字符串当作一个行向量,每个 元素对应一个字符,其标识方法和数值向量 相同。也可以建立多行字符串矩阵。 字符串是以ASCII码形式存储的。abs和 double函数都可以用来获取字符串矩阵所对 应的ASCII码数值矩阵。相反,char函数可 以把ASCII码矩阵转换为字符串矩阵。 3. 复数和复数矩阵 – 复数单位为I或j – 复数表示: z=3+4i和 z=3+4j作用一样 – 复数矩阵表示 a=[12;34]+[56;78]*i a=[1+5i 2+6i ; 3+7i 4+8i] --复数相关的函数有real,imag, conj, abs, angle 四、简单的数学运算 1、常用的数学运算符 +(加)、-(减)、*(乘)、/(右除)、\(左除)、^(乘方)。 注意,运算是在矩阵意义下进行的,单个数据的 算术运算只是一种特例。 ? 在运算式中,MATLAB通常不需要考虑空格;多条 命令可以放在一行中,它们之间需要用分号或逗 号隔开;逗号告诉MATLAB显示结果,而分号则禁 止结果显示。 2、常用数学函数 abs,sin,cos,tan,asin,acos,atan,sqrt,exp,imag,rea l,sign, log,log10,conj(共扼复数)等 五、 数 组 运 算 ( 元 素 对 元 素 的 算 术 运 算 ) 在运算符前加上句点(.)就表示数组运算 (P53) ? 1.加法运算 同矩阵加减法运算 ? 2.乘法 运算符 “ .* ‖ 数组乘法运算符 格式:z=a.*b 运算:表示a和b 中对应元素的乘积 ? 3.除法:运算符: .\——左除、 . /——右除 ? 4.乘方 ? x 和y均为向量时,z=x.^y表示对应元素的乘 方,即z(i)=x(i)y(i) 举例:x=[1 2 3 ],y= [4 5 6 ] z=x.^y ? x 为向量,y为标量时,z=x.^y表示z(i)=x(i)y(i) 举例:x=[1 2 3 ] z=x.^2 ? x 为标量,y为向量时,z=x.^y表示z(i)=xy(i) 举例:y=[1 2 3 ] z=2.^y ? 5.指数运算、对数运算和开方运算 – Exp(a) 将每个元素作为指数,e作为底数运算, – Log(a) – Sqrt(a) (1) 矩阵加减运算 假定有两个矩阵A和B,则可以由A+B和A-B 实现矩阵的加减运算。运算规则是:若A和B 矩阵的维数相同,则可以执行矩阵的加减运 算,A和B矩阵的相应元素相加减。如果A与 B的维数不相同,则MATLAB将给出错误信 息,提示用户两个矩阵的维数不匹配。 (2) 矩阵乘法 假定有两个矩阵A和B,若A为m×n矩阵,B 为n×p矩阵,则C=A*B为m×p矩阵。 (3) 矩阵除法 在MATLAB中,有两种矩阵除法运算:\和/,分别 表示左除和右除。如果A矩阵是非奇异方阵,则A\B 和B/A运算可以实现。A\B等效于A的逆左乘B矩阵, 也就是inv(A)*B,而B/A等效于A矩阵的逆右乘B矩 阵,也就是B*inv(A)。 对于含有标量的运算,两种除法运算的结果相同, 如3/4和4\3有相同的值,都等于0.75。又如,设 a=[10.5,25],则a/5=5\a=[2.1000 5.0000]。对于矩阵 来说,左除和右除表示两种不同的除数矩阵和被除 数矩阵的关系。对于矩阵运算,一般A\B≠B/A。 (4) 矩阵的乘方 一个矩阵的乘方运算可以表示成A^x,要 求A为方阵,x为标量。 2.点运算 在MATLAB中,有一种特殊的运算,因 为其运算符是在有关算术运算符前面加点, 所以叫点运算。点运算符有.*、./、.\和.^。 两矩阵进行点运算是指它们的对应元素进行 相关运算,要求两矩阵的维参数相同。 2.3.3.2 关系运算 MATLAB提供了6种关系运算符:<(小于)、 <=(小于或等于)、>(大于)、>=(大于或等于)、 ==(等于)、~=(不等于)。它们的含义不难理 解,但要注意其书写方法与数学中的不等式 符号不尽相同。 关系运算符的运算法则为: (1) 当两个比较量是标量时,直接比较两 数的大小。若关系成立,关系表达式结果为 1,否则为0。 (2) 当参与比较的量是两个维数相同的矩 阵时,比较是对两矩阵相同位置的元素按标 量关系运算规则逐个进行,并给出元素比较 结果。最终的关系运算的结果是一个维数与 原矩阵相同的矩阵,它的元素由0或1组成。 (3) 当参与比较的一个是标量,而另一个是 矩阵时,则把标量与矩阵的每一个元素按标 量关系运算规则逐个比较,并给出元素比较 结果。最终的关系运算的结果是一个维数与 原矩阵相同的矩阵,它的元素由0或1组成。 参考书本上的例子P26例2.1 小结 ? <、<=、>、>=、 = =(等于)、 ~=(不等于) ? 运算过程(P26):两矩阵对应元素比较,所有的 非0值都当作1处理,关系成立则为1,否则为0 举例:a=[-1 2 4;5 4 8] b=[0 1 5 ;5 1 2] c=a>b c=a4) 2.3.3 逻辑运算 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组成。(参看P27例 子) (4) 若参与逻辑运算的一个是标量,一个是矩 阵,那么运算将在标量与矩阵中的每个元素 之间按标量规则逐个进行。最终运算结果是 一个与矩阵同维的矩阵,其元素由1或0组成。 (5) 逻辑非是单目运算符,也服从矩阵运算规 则。 (6) 在算术、关系、逻辑运算中,算术运算优 先级最高,逻辑运算优先级最低。 ? 运算符:&(与)、|(或)、~(非) ? 运算过程:元素对元素操作,每个非0元素 都当作“1―处理,运算结果为0、1矩阵 ? MATLAB还提供了大量的逻辑函数,参看P27, 比如xor、any、all、find等等。 六、数学函数 ? 数学函数,主要作用于数组的每一个元素 a=[1 2 3 ;4 5 6]; b=fix(pi*a) ; 每个元素取整 c=cos(pi*b); ? fix:向零取整 MATLAB提供了许多数学函数,函数的自变量 规定为矩阵变量,运算法则是将函数逐项作用 于矩阵的元素上,因而运算的结果是一个与自 变量同维数的矩阵。 函数使用说明: (1) 三角函数以弧度为单位计算。 (2) abs函数可以求实数的绝对值、复数的模、 字符串的ASCII码值。 (3) 用于取整的函数有fix、floor、ceil、round, 要注意它们的区别。 (4) rem与mod函数的区别。rem(x,y)和mod(x,y) 要求x,y必须为相同大小的实矩阵或为标量。 4 特殊运算符 ? 冒号是MATLAB中最为有用的运算符之一。冒号可以 用来创建矩阵,也可以访问矩阵中特定的行、列或 元素。 ? 当冒号用于创建向量时: ? 用冒号表达式生成向量 ? 格式: [变量=]n:s:m ? 功能:产生从n到m,步长为s的一系列值 ? 举例1:x=1:1:5 产生1、2、3、4、5五个元素的矩阵 ? 举例2:z=-pi:pi/2:pi ? 当冒号用于创建下标数组时,可以挑出指定的行、 列及矩阵: (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表示某一维的末尾元 素下标。比如:B(2:end,:)将提取B矩阵的 后2行构成子矩阵。 (2) 利用空矩阵删除矩阵的元素 在MATLAB中,定义[]为空矩阵。给变量X赋 空矩阵的语句为X=[]。注意,X=[]与clear X不同, clear是将X从工作空间中删除,而空矩阵则存在 于工作空间中,只是维数为0。 ? 大矩阵中抽取一小矩阵 b=a(1:3,:) 抽取a中1:3行所有元素构成b c=a(:,1:2) 抽取a中1:2列所有元素构成b ? 矩阵行列删除 利用空矩阵可从矩阵中删除指定的行和列 例如要删除b第二行,则使用命令: b(2,:)=[] 例如要删除b第二列,则使用命令: b(:,2)=[] 第四节 MATLAB程序设计入门 一、MATLBA程序的基本设计原则 1、%后面的内容是程序的注解,要善于运用注解使程序更具可读性。 2、养成在主程序开头用clear指令清除变量的习惯,以消除工作空间中其 他变量对程序运行的影响。但注意在子程序中不要用clear。 3、参数值要集中放在程序的开始部分,以便维护。要充分利用MATLAB 工具箱提供的指令来执行所要进行的运算,在语句行之后输入分号使 其及中间结果不在屏幕上显示,以提高执行速度。 4、input指令可以用来输入一些临时的数据;而对于大量参数,则通过建 立一个存储参数的子程序,在主程序中用子程序的名称来调用。 5、程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程 序合并在一起来执行全部的操作。 6、充分利用Debugger来进行程序的调试(设置断点、单步执行、连续执 行),并利用其他工具箱或图形用户界面(GUI)的设计技巧,将设 计结果集成到一起。 7、设置好MATLAB的工作路径,以便程序运行。 8、MATLAB程序的基本组成结构 %说明 清除命令:清除workspace中的变量和图形(clear,close) 定义变量:包括全局变量的声明及参数值的设定 逐行执行命令:指MATLAB提供的运算指令或工具箱 ……… 提供的专用命令 控制循环 :包含for,if then,switch,while等语句 逐行执行命令 ……… end 绘图命令:将运算结果绘制出来 ? 当然更复杂程序还需要调用子程序,或与simulink以及其 他应用程序结合起来。 二、M文件的编辑及MATLAB工作路径的设置 ? 进入MATLAB的Editor/Debugger窗口来编辑程序 ? 在编辑环境中,文字的不同颜色显示表明文字的不同属性。 绿色:注解;黑色:程序主体;红色:属性值的设定;蓝 色:控制流程。 ? 在运行程序之前,必须设置好MATLAB的工作路径,使得所 要运行的程序及运行程序所需要的其他文件处在当前目录 之下,只有这样,才可以使程序得以正常运行。否则可能 导致无法读取某些系统文件或数据,从而程序无法执行。 ? 通过cd指令在命令窗口中可以更改、显示当前工作路径。 ? 通过路径浏览器(path browser)也可以进行设置 三、MATLAB的程序类型 MATLAB的程序类型有三种,一种是在命令窗口下执行的 脚本M文件;另外一种是可以存取的M文件,也即程序文 件;最后一种是函数(function)文件。 1、脚本M文件 在命令窗口中输入并执行,它所用的变量都要在工作空间中 获取,不需要输入输出参数的调用,退出MATLAB后就释放了。 2、程序文件 ? 以.m格式进行存取,包含一连串的MATLAB指令和必要的注 解。需要在工作空间中创建并获取变量,也就是说处理的 数据为命令窗口中的数据,没有输入参数,也不会返回参 数。 ? 程序运行时只需在工作空间中键入其名称即可。 3、函数文件 ? 与在命令窗口中输入命令一样,函数接受输入参数,然后执行并输出 结果。用help命令可以显示它的注释说明。 ? 具有标准的基本结构。 (1)函数定义行(关键字function) ? function[out1,out2,..]=filename(in1,in2,..) ? 输入和输出(返回)的参数个数分别由nargin和nargout两个MATLAB保 留的变量来给出。 (2)第一行帮助行,即H1行 ? 以(%)开头,作为lookfor指令搜索的行 (3)函数体说明及有关注解 ? 以(%)开头,用以说明函数的作用及有关内容 ? 如果不希望显示某段信息,可在它的前面加空行 (4)函数体语句 ? 函数体内使用的除返回和输入变量这些在function语句中直接引用的变 量以外的所有变量都是局部变量,即在该函数返回之后,这些变量会自 动在MATLAB的工作空间中清除掉。如果希望这些中间变量成为在整个程 序中都起作用的变量,则可以将它们设置为全局变量。 3.1 M文件 3.1.1 M文件概述 用MATLAB语言编写的程序,称为M 文件。M文件可以根据调用方式的不同 分为两类:命令文件(Script File)和函数 文件(Function File)。 3.1.2 M文件的建立与打开 M文件是一个文本文件,它可以用任何编辑程序来建立和 编辑,而一般常用且最为方便的是使用MATLAB提供的文 本编辑器。 1.建立新的M文件 为建立新的M文件,启动MATLAB文本编辑器有3种方法: (1) 菜单操作。从MATLAB主窗口的File菜单中选择New菜 单项,再选择M-file命令,屏幕上将出现MATLAB 文本编 辑器窗口。 (2) 命令操作。在MATLAB命令窗口输入命令edit,启动 MATLAB文本编辑器后,输入M文件的内容并存盘。 (3) 命令按钮操作。单击MATLAB主窗口工具栏上的New M-File命令按钮,启动MATLAB文本编辑器后,输入M文 件的内容并存盘。 2.打开已有的M文件 打开已有的M文件,也有3种方法: (1) 菜单操作。从MATLAB主窗口的File菜单中选 择Open命令,则屏幕出现Open对话框,在Open对 话框中选中所需打开的M文件。在文档窗口可以对 打开的M文件进行编辑修改,编辑完成后,将M文 件存盘。 (2) 命令操作。在MATLAB命令窗口输入命令: edit 文件名,则打开指定的M文件。 (3) 命令按钮操作。单击MATLAB主窗口工具栏上 的Open File命令按钮,再从弹出的对话框中选择 所需打开的M文件。 例3-1 分别建立命令文件和函数文件,将华氏温 度f转换为摄氏温度c。 程序1: 首先建立命令文件并以文件名f2c.m存盘。 clear; %清除工作空间中的变量 f=input('Input Fahrenheit temperature:'); c=5*(f-32)/9 然后在MATLAB的命令窗口中输入f2c,将会执 行该命令文件,执行情况为: Input Fahrenheit temperature:73 c= 22.7778 程序2: 首先建立函数文件f2c.m。 function c=f2c(f) c=5*(f-32)/9 然后在MATLAB的命令窗口调用该函数文件。 clear; y=input('Input Fahrenheit temperature:'); x=f2c(y) 输出情况为: Input Fahrenheit temperature:70 c= 21.1111 x= 21.1111 3.3 函数文件总结 3.3.1 函数文件的基本结构 函数文件由function语句引导,其基本结构为: function 输出形参表=函数名(输入形参表) 注释说明部分 函数体语句 end 其中以function开头的一行为引导行,表示该M文件 是一个函数文件。函数名的命名规则与变量名相同 。输入形参为函数的输入参数,输出形参为函数的 输出参数。当输出形参多于一个时,则应该用方括 号括起来。 例3-2 编写函数文件求半径为r的圆的面积和 周长。 函数文件如下: function [s,p]=fcircle(r) %CIRCLE calculate the area and perimeter of a circle of radii r %r 圆半径 %s 圆面积 %p 圆周长 %2008年3月4日编 s=pi*r*r; p=2*pi*r; 3.3.2 函数调用 函数调用的一般格式是: [输出实参表]=函数名(输入实参表) 要注意的是,函数调用时各实参出现 的顺序、个数,应与函数定义时形参 的顺序、个数一致,否则会出错。函 数调用时,先将实参传递给相应的形 参,从而实现参数传递,然后再执行 函数的功能。 四、声明子程序(函数程序)变量 1、子程序与主程序之间的数据是通过参数进行传递的,子程 序应用主程序传递来的参数进行计算后,将结果返回主程序。 2、如果一个函数内的变量没有特别声明,那么这个变量只 在函数内部使用,即为局部变量。如果两个或多个函数共用 一个变量(或者说在子程序中也要用到主程序中的变量,注 意不是参数),那么可以用global来将它声明为全局变量。 全局变量的使用可以减少参数传递,合理利用全局变量可以 提高程序执行的效率。 六、常用的编程命令 ? 用户和程序的交互包括两个方面,输入数据和暂停 ? ?input命令 格式:n=input (‘显示信息字符串’) 通过键盘输入的数据可以是数值也可以是字符串。 x=input(?prompt‘):把输入的字符串作为提示符,等待使 用者输入一个响应,然后把它赋值到x。 ? pause:停止m文件的执行直至有键按下。pause(n)将使程 序暂停n秒。系统暂停状态,也进入键盘主控状态 ? echo on/off:控制是否在屏幕上显示程序内容。 echo on/off 显示/不显示命令文件中的控制 echo 两种状态下切换 ? keyboard:停止程序执行,把控制权交给键盘。输入 return并回车后继续程序执行。 3.2 程序控制结构 3.2.1 顺序结构 1.数据的输入 从键盘输入数据,则可以使用input函数来 进行,该函数的调用格式为: A=input(提示信息,选项); 其中提示信息为一个字符串,用于提示用 户输入什么样的数据。 如果在input函数调用时采用's'选项,则允 许用户输入一个字符串。例如,想输入一 个人的姓名,可采用命令: xm=input('What''s your name?','s'); 2.数据的输出 MATLAB提供的命令窗口输出函数主要有 disp函数,其调用格式为 disp(输出项) 其中输出项既可以为字符串,也可以为矩阵。 例3-3 输入x,y的值,并将它们的值互换后输 出。 程序如下: x=input('Input x please.'); y=input('Input y please.'); z=x; x=y; y=z; disp(x); disp(y); 例3-4 求一元二次方程ax2 +bx+c=0的根。 程序如下: 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)),',x2=',num2str(x(2)) ]); 3.程序的暂停 暂停程序的执行可以使用pause函数, 其调用格式为: pause(延迟秒数) 如果省略延迟时间,直接使用pause, 则将暂停程序,直到用户按任一键后 程序继续执行。 若要强行中止程序的运行可使用 Ctrl+C命令。 3.2.2 选择结构 1.if语句 在MATLAB中,if语句有3种格式。 (1) 单分支if语句: if 条件 语句组 end 当条件成立时,则执行语句组,执行完之后继 续执行if语句的后继语句,若条件不成立, 则直接执行if语句的后继语句。 (2) 双分支if语句: if 条件 语句组1 else 语句组2 end 当条件成立时,执行语句组1,否则执行语 句组2,语句组1或语句组2执行后,再执行if 语句的后继语句。 例3-5 计算分段函数的值。 程序如下: x=input('请输入x的值:'); if x<=0 y= (x+sqrt(pi))/exp(2); else y=log(x+sqrt(1+x*x))/2; end y (3) 多分支if语句: if 条件1 语句组1 elseif 条件2 语句组2 …… elseif 条件m 语句组m else 语句组n end 语句用于实现多分支选择结构。 例3-6 输入一个字符,若为大写字母,则输出其对 应的小写字母;若为小写字母,则输出其对应的 大写字母;若为数字字符则输出其对应的数值, 若为其他字符则原样输出。 c=input('请输入一个字符','s'); if c>='A' & c<='Z' disp(setstr(abs(c)+abs('a')-abs('A'))); elseif c>='a'& c<='z' disp(setstr(abs(c)- abs('a')+abs('A'))); elseif c>='0'& c<='9' disp(abs(c)-abs('0')); else disp(c); end 2.switch语句 switch语句根据表达式的 当表达式的值等于表达式 取值不同,分别执行不同 1的值时,执行语句组1, 的语句,其语句格式为: 当表达式的值等于表达 式2的值时,执行语句 switch 表达式 组2,…,当表达式的 case 表达式1 值等于表达式m的值时, 语句组1 执行语句组m,当表达 case 表达式2 式的值不等于case所列 的表达式的值时,执行 语句组2 语句组n。当任意一个 …… 分支的语句执行完后, case 表达式m 直接执行switch语句的 语句组m 下一句。 otherwise 语句组n end 例3-7 某商场对顾客所购买的商品实行打折销 售,标准如下(商品价格用price来表示): price<200 没有折扣 200≤price<500 3%折扣 500≤price<1000 5%折扣 1000≤price<2500 8%折扣 2500≤price<5000 10%折扣 5000≤price 14%折扣 输入所售商品的价格,求其实际销售价格。 程序如下: price=input('请输入商品价格'); switch fix(price/100) case {0,1} %价格小于200 rate=0; case {2,3,4} %价格大于等于200但小于500 rate=3/100; case num2cell(5:9) %价格大于等于500但小于1000 rate=5/100; case num2cell(10:24) %价格大于等于1000但小于2500 rate=8/100; case num2cell(25:49) %价格大于等于2500但小于5000 rate=10/100; otherwise %价格大于等于5000 rate=14/100; end price=price*(1-rate) %输出商品实际销售价格 3.try语句 语句格式为: try 语句组1 catch 语句组2 end try语句先试探性执行语句组1,如果语句 组1在执行过程中出现错误,则将错误 信息赋给保留的lasterr变量,并转去执 行语句组2。 例3-7 矩阵乘法运算要求两矩阵的维数相容,否则会 出错。先求两矩阵的乘积,若出错,则自动转去 求两矩阵的点乘。 程序如下: A=[1,2,3;4,5,6]; B=[7,8,9;10,11,12]; try C=A*B; catch C=A.*B; end C lasterr %显示出错原因 3.2.3 循环结构 1.for语句 for语句的格式为: for 循环变量=表达式1:表达式2:表达式3 循环体语句 end 其中表达式1的值为循环变量的初值,表达式2 的值为步长,表达式3的值为循环变量的终 值。步长为1时,表达式2可以省略。 例3-8 一个三位整数各位数字的立方和等于该数本 身则称该数为水仙花数。输出全部水仙花数。 程序如下: for m=100:999 m1=fix(m/100); %求m的百位数字 m2=rem(fix(m/10),10); %求m的十位数字 m3=rem(m,10); %求m的个位数字 if m==m1*m1*m1+m2*m2*m2+m3*m3*m3 disp(m) end end 2.while语句 while语句的一般格式为: while (条件) 循环体语句 end 其执行过程为:若条件成立,则执行 循环体语句,执行后再判断条件是否成 立,如果不成立则跳出循环。 例3-9 从键盘输入若干个数,当输入0时结束输入, 求这些数的平均值和它们之和。 程序如下: sum=0; cnt=0; val=input('Enter a number (end in 0):'); while (val~=0) sum=sum+val; cnt=cnt+1; val=input('Enter a number (end in 0):'); end if (cnt > 0) sum mean=sum/cnt end 3.break语句和continue语句 与循环结构相关的语句还有break语句和 continue语句。它们一般与if语句配合使用 。 break语句用于终止循环的执行。当在循环 体内执行到该语句时,程序将跳出循环, 继续执行循环语句的下一语句。 continue语句控制跳过循环体中的某些语句 。当在循环体内执行到该语句时,程序将 跳过循环体中所有剩下的语句,继续下一 次循环。 例3-12 求[100,200]之间第一个能被21整除的 整数。 程序如下: for n=100:200 if rem(n,21)~=0 continue end break end n 4.循环的嵌套 如果一个循环结构的循环体又包括一个循环结构,就称为循 环的嵌套,或称为多重循环结构。 例3-13 若一个数等于它的各个真因子之和,则称该数为完 数,如6=1+2+3,所以6是完数。求[1,500]之间的全部完数。 for m=1:500 s=0; for k=1:m/2 if rem(m,k)==0 s=s+k; end end if m==s disp(m); end end 3.5 程序调试 3.5.1 程序调试概述 一般来说,应用程序的错误有两类,一类是语法错误, 另一类是运行时的错误。语法错误包括词法或文法 的错误,例如函数名的拼写错、表达式书写错等。 程序运行时的错误是指程序的运行结果有错误,这类 错误也称为程序逻辑错误。 3.5.2 调试器 1.Debug菜单项 该菜单项用于程序调试,需要与Breakpoints 菜单项配合使用。 2.Breakpoints菜单项 该菜单项共有6个菜单命令,前两个是用于在 程序中设置和清除断点的,后4个是设置停 止条件的,用于临时停止M文件的执行,并 给用户一个检查局部变量的机会,相当于在 M文件指定的行号前加入了一个keyboard命 令。 3.5.3 调试命令 除了采用调试器调试程序外,MATLAB 还提供了一些命令用于程序调试。命令 的功能和调试器菜单命令类似,具体使 用方法请读者查询MATLAB帮助文档。