MATLAB程序设计基础与程序调试和优化.ppt
2023/11/8,1,MATLAB 程序设计基础,2023/11/8,2,主要内容,MatLab基本程序设计注意事项 MATLAB程序的基本组成部分工作环境的设定 MatLab的基本语法,2023/11/8,3,MatLab基本程序设计注意事项,设置完整的路径,最好把当前的处理位置设定为Current Directory.若在每行程序的最后输入分号,则执行程序行结果不会显示在屏幕上,否则,执行程序行的结果会显示在屏幕上。符号“”后面的内容是程序的注解,不作为命令运行。遇到不明白的命令,多使用在线帮助命令或系统演示示例。(多动脑筋找原因,这本身也是一种能力培养)程序尽量模块化,也就是采用主程序调用子程序的方法,将所有子程序统一用主程序调用执行全部的操作。注意变量的定义。留意各种命令的书写格式(Matlab中是大小写敏感的)。,2023/11/8,4,MATLAB程序的基本组成部分,说明部分(或称之为注释部分)清除命令(可选)定义变量(局部变量和全局变量)按照顺序行执行的命令语句控制语句开始 控制语句体 控制语句结束其他命令(如绘图等),2023/11/8,5,工作环境的设定,路径设置有两种方法:(1)在命令窗口下使用cd命令,直接更改工作路径。(2)在菜单中选择“File”“Set Path”,就会出现“Set Path”窗口,然后进行设置设置路径的原因:对于用户程序中使用的文件名和变量名,系统按照以下顺序搜索:(1)查找对象是否是工作空间的变量。(2)查找对象是否是系统的内部函数。(3)查找对象是否是在系统的当前目录下,2023/11/8,6,MatLab的基本语法,数据类型常量和变量 程序运算符 程序控制语句 M文件,2023/11/8,7,MatLab的基本语法-数据类型(1),MatLab 6.5 共有7种基本的数据类型以及若干衍生类型。汇总如下图所示。,2023/11/8,8,MatLab的基本语法-数据类型(2),各种主要数据类型的特征和用途,2023/11/8,9,MatLab的基本语法-常量和变量,MatLab中的常量:类似于c语言中的整型常量和实型常量,常量的表方法一般采用十进制数来表示,可以带正负号和小数点,当然也可采用科学记数法。如1、25、0.0033、2e7、pi、2十3i等都是MATLAB的合法常量。这里的2十3i是复数常量,它是由实数与虚数单位i组成MATLAB中的变量:一般无需事先定义。一个程序中的变量以其名称在操作语句第一次合法出现而定义。如果这个变量已经存在,那么MATLAB将改变它的内容,如a2.5定义了一个变量a,并给它赋值2.5;如果再输入a3,那么变量a的值就变为3。,2023/11/8,10,MatLab的基本语法-常量和变量(2),MATLAB中的变量命名应该遵循以下规则:变量名必须以字母开头,后面可以是任意的字母、数字或下划线。MATLAB变量名有效的最大长度是31。MLAB的变量要区分大小写,如:MY_NAME,My_name,my_name分别表示不同的变量。MatLab自身带有一些具有特殊含义的变量和常量,用户在使用时不能对这些量进行变更。例如:pi表示圆周率,inf表示数学中的正无穷大等。,2023/11/8,11,MatLab的基本语法 程序运算符,MATLAB的运算符可分为三类:算术运算符关系运算符逻辑运算符,2023/11/8,12,MatLab的基本语法 程序运算符,算术运算符:(除左除以外,其余与c语言符号是一致的)加法 减法 乘法*除法/左除(主要用于矩阵除法)乘方 执行时的优先法则按照以下规则:(1)表达式从左到右执行。(2)乘方运算具有最高的优先级。(3)乘法和除法运算具有相同的次优先级;加法和减法具有相同的最低优先级。(4)括号可以改变优先次序,由最内层的括号向外执行。,2023/11/8,13,MatLab的基本语法 程序运算符,关系运算符关系运算符对于程序流程控制非常有用,在MATLAB的循环和条件控制中经常使用。MATLAB共有6个关系运算符:小于 大于等于=等于 不等于=注意:MATLAB中所有关系运算符连接的两个操作数或者同维、同大小,或者其中一个为标量。有一个操作数是标量时,关系运算符把标量和另一个操作数的每个元素进行比较。对大小相同的两个矩阵,进行关系运算时,相应的每一个元素进行比较,如果能够满足指定的关系,返回1,否则返回0。,2023/11/8,14,MatLab的基本语法 程序运算符,逻辑运算符MATLAB里共有4个逻辑运算符:与 或|非 逻辑异或 XOR注意:和关系运算符一样除了逻辑运算符的一个操作数为矩阵或向量时,另一个操作数可为标量,其余情况下均要求矩阵同维。逻辑运算符也是对操作数的相应元素一一运算,最后返回一个01矩阵。当逻辑表达式的值为真时,返回1,否则返回0。,2023/11/8,15,MatLab的基本语法 程序控制语句,MATLAB控制语句主要有以下几类:for循环结构While循环结构ifelseend分支结构 switchcase分支结构,2023/11/8,16,MatLab的基本语法 程序控制语句,for循环结构 for循环语句通常用来执行循环次数已知的情况。它可以按照用户指定的次数来执行循环体中的内容。调用格式:for x初值:步长:终值 循环体 end 注意:变量x通常称为循环变量;初值、终值和步长可以是标量,也可以是表达式。当循环语句开始执行时,变量x的值被赋为和初值相同的内容。每执行一次循环体中的内容,变量x的值就会按照步长的大小来改变。如果步长是一个正数,那么变量x的值增加一个步长;如果步长是一个负数,那么变量的值就减小一个步长。在步长为正的情况下,如果变量的值小于终值,就将继续执行循环体中的内容。当步长为负时,如果变量的值大于终值,也将继续执行循环体中的内容。如此循环,直到变量的值大于或者小于终值的内容,这个for语句循环就结束,而继续执行end语句下面的命令。语句中的步长可以省略不写,在这种情况下,默认的步长值为1。for循环语句允许嵌套,每一个“for”关键字必须和一个“end”配对。,2023/11/8,17,MatLab的基本语法 程序控制语句,While循环结构 while语句根据一个控制表达式的值来确定程序的运行方式。常用于事先不能确定循环次数的情况。调用格式:while表达式 循环体 end 当表达式中的值为真时,执行循环体。当循环体执行完毕后,继续判断表达式的值,如果仍为真,那么继续执行循环体,如此循环,直到表达式的值为假时终止循环。当表达式的值是一个矩阵,且矩阵中所有元素都不为零时,才执行循环体中的内容。如果表达式A是一个空矩阵,那么循环体中的内容永远不会被执行。另外,要想在任何时候终止循环(for或while循环),可利用break语句。终止循环后继续执行end语句下面的语句。,2023/11/8,18,MatLab的基本语法 程序控制语句,ifelseend分支结构 if语句是一种条件选择结构语句,它根据不同逻辑表达式的值来判断程序在执行过程中需要执行哪些语句。调用格式:if 逻辑表达式 命令语句体 end 在程序执行该语句的过程中,首先判断逻辑表达式的值。如果逻辑表达式的值为真,那么程序就会执行命令语句体的所有语句。如果逻辑表达式的值为假,那么就跳过命令语句体,继续执行end语句之后的语句。,2023/11/8,19,MatLab的基本语法 程序控制语句,switchcase分支结构 switch语句可以根据一个变量或表达式的值执行特定的语句。调用格式:switch表达式0 case表达式l的值 命令行l case表达式2的值 命令行2.otherwise 命令行n end,先计算switch后面表达式0的值,然后检查case语句后面的值是否与表达式0的值相等,如表达式1的值与之相等,则执行命令行1,否则继续检查第二个case子句,以此类推,如果所有case子句的值均不等于表达式0的值,则执行othewise语句后面的命令行n。和c语言不同的是,在switch结构中,如果一个case条件满足,那么在执行完这个case语句中的语句体之后,就会立接去执行end语句后面的语句而不并判断其他case语句的情况。,2023/11/8,20,MatLab的基本语法 M文件,引入M文件的原因:对于比较简单的问题和一次性问题,通过指令窗中直接输入一组指令去求解,也许是比较简便、快捷的。但当待解决问题所需的指令较多和所用指令结构较复杂时,或当一组指令通过改变少量参数就可以被反复使用去解决不同问题时,直接在指令窗中输入指令的方法就显得烦琐。为了代替在MATLAB提示符下输入的多条MATLAB命令语句,可以把这些命令写入一个文本文件,这个文本文件可用一个编辑器创建。每当用户输入这个文件名以及它的自变量时,这些命令就由MATLAB执行。当文件中最后一个命令被执行时,MATLAB能再从指令窗口读取命令,这样的文件就叫做M文件。,2023/11/8,21,MatLab的基本语法 M文件类型,M文件的类型:脚本(Script)文件,教材中也称之为命令文件函数(Function)文件这两种文件均以“.m”为后缀。,2023/11/8,22,MatLab的基本语法 脚本M文件,脚本(Script)文件(命令文件):脚本文件的主要用途是使命令输入更加简单化。如果用户需要重复输入许多命令,即可将这些命令放在一个脚本文件里(脚本文件没有输入参数和输出参数)。可以说,脚本文件只不过是将用户在MATLAB的命令行窗口中输入的一串命令用另外一个名称代替而己,并且脚本文件的运行结果每次都是相同的。特点如下:该文件中的指令形式和前后位置,与解决同一个问题时在指令窗中输入的那组指令没有任何区别。MATLAB在运行这个脚本时,只是简单地从文件中读取一条条指令送到MATLAB中执行。与在指令窗中直接运行指令一样,脚本文件运行产生的变量都是驻留在MATLAB基本工作空间中。,2023/11/8,23,MatLab的基本语法 函数M文件,函数(Function)文件:函数文件的主要用途是用来扩充MATLAB的应用范围和满足用户不同的实际应用需求。函数文件可以接受输入变量,也可以返回输出变量。除了输入变量和输出变量以外,在函数文件内部的其他变量通常为该函数文件的局部变量,并不会出现在MATLAB的工作空间内。而能够保留在MATLAB的工作空间内的变量只有该函数文件的输入和输出变量。也就是说,函数文件对于变量的运算是在函数本身的工作空间内进行的,它和MATLAB的命令窗口中的工作空间是相互独立的。MATLAB对函数文件的处理与对脚本文件的处理不同,函数文件对外只表现其输入参数和输出结果,内部的运作对外是封闭的,利用这个特性,容易实现编程的模块化。函数文件的具体特点如下:从形式上看,与脚本文件不同,函数文件的第一行总是以“function”引导的“函数申明行”。从运行上看,与脚本文件运行不同,每当函数文件运行,MATLAB就会专门为它开辟一个临时工作空间。称之为函数工作空间(function workspace)。所有中间变量都存放在函数工作空间中。当执行完文件最后一条指令或遇到return时,就结束该函数文件的运行,同时该临时函数空间及其所有的中间变量就立即被清除。函数空间随具体M函数文件的被调用而产生,随调用结束而删除。函数空间相对基本空间是独立的、临时的。在MATLAB整个运行期间,可以产生任意多个临时函数空间。假如在函数文件中,发生对某脚本文件的调用,那么该脚本文件运行产生的所有变量都存放于该函数空间之中,而不是存放在基本空间。,2023/11/8,24,MatLab的基本语法 M文件编辑调试器,M文件编辑调试器(Editor/Debugger)简介 M文件也只是一个普通的文本文件,因此可以利用任何的文本编辑器来建立、编辑和修改,只要使文件的后缀为“.m”即可。除了可以利用自己所喜爱的文本编辑器以外,MATLAB还提供了一个内置的编辑器。这是一个集编辑与调试两种功能于一体的工具环境,利用它不仅可以完成基本的文本编辑操作,还可以对M文件进行调试。,2023/11/8,25,MatLab的基本语法 M文件编辑调试器的启动,启动M文件编辑调试器的方法:有三种操作方法:直接在MATLAB命令窗口运行命令edit。单击MATLAB桌面窗口工具栏上的新建图标从MATLAB桌面窗口中选择菜单“File”“New”“M_file”。,2023/11/8,26,MatLab的基本语法 打开M文件的方法,打开已有M文件的三种操作方法:直接在MATLAB命令窗口运行命令edit filenam,filename是待打开的文件名,可不带扩展名。单击MATLAB工具栏上的打开图标,再从弹出对话框中选择要打开的文件。单击MATLA菜单“File”“open”子菜单,再从弹出对话框中选择需打开的文件。,2023/11/8,27,MatLab的基本语法 M文件的调试,编辑或修改好的文件经保存后即可单击“Debug”项中的“Run”进行运行,或者在命令窗口中直接输入此M文件的名称,就可观察到运行结果,如果有错误,则在命令窗口中给出相应的提示,可根据出错提示找到错误的地方进行修改。,2023/11/8,28,MatLab的基本语法 M文件的一般结构,由于从结构上看,脚本文件只是比函数文件少一个“函数申明行”,所以只须描绘清楚函数文件的结构,脚本文件的结构也就无须多费笔墨了。典型M函数文件的结构如下:(1)函数申明行(function declaration line):位于函数文件的首行,以MATLAB关键字function开头,函数名以及函数的输入输出宗量都在这一行定义。(2)H1行(The first help text line):紧随函数申明行之后以开头的第一注释行。按MATLAB自身文件的规则,Hl行包含:大写体的函数文件名;运用关键词简要描述的函数功能。该H1行供lookfor关键词查询和help在线帮助使用。(3)在线帮助文本(Help text)区:Hl行及其之后的连续以开头的所有注释行构成整个在线帮助文本。它通常包括:函数输入输出宗量的含义,调用格式说明。(4)编写和修改记录:与在线帮助文本区相隔一个“空”行,也以开头,标志编写及修改该M文件的作者和日期、版本记录。它用于软件档案管理。(5)函数体(Function body):为清晰起见,它与前面的注释以“空”行相隔。这部分内容由实现该M函数文件功能的MATLAB指令组成。它接收输入宗量,进行程序流控制,得到输出宗量。其中为阅读、理解方便,也配置适当的空行和注释。若仅从运算角度看,惟有“函数申明行”和“函数体”两部分是构成M函数文件所必不可少的。,2023/11/8,29,M文件的命名,不能用数字作为文件名。不能用和Matlab特有变量名相同的名称。不能和已在workspace中的变量或常量同名。,2023/11/8,30,MatLab程序调试和代码优化,MatLab编程技巧,2023/11/8,31,MatLab程序的常见错误,编写M文件时,常见的错误有两种:语法错误和运行错误。语法错误:指变量名、函数名的误写,标点符号的缺漏等。这类错误Matlab能在运行前发现给出提示(包括相应的错误原因和所在位置),并终止运行。运行错误:指算法本身引起的,发生在运行过程中的错误。相对语法错误,动态的运行错误较难查找和处理。,2023/11/8,32,运行错误难以查找和处理的原因,运行错误来源多元化。如来源于算法模型和期望目标是否一致,程序模型和算法是否一致,涉及用户对期望目标原理的理解、对算法的理解,还涉及用户对Matlab指令的理解、对程序流的理解,及对Matlab工作原理的理解。运行错误的表现形式多样化:程序正常运行但结果不对,程序运行不正常而中断等。运行错误是动态错误。尤其是M函数文件,它一旦停止运行,其中间变量被删除一空,错误很难查找。另外有些情况下结果正常,有些情况下结果不正确。程序的运行错误必须借助程序调试技术才能解决。,2023/11/8,33,MatLab程序调试方法,直接调试法利用调试器,2023/11/8,34,直接调试法,由于MatLab语言可读性强,对于较简单的程序直接调试法比较有效。直接调试一般包括以下几个方面:检查所调用的函数或要载入的数据文件是否在当前目录或搜索路径上。将重点怀疑的语句行、指令行后的“;”去掉,使计算结果能显示在主命令窗口。在适当的位置加入显示某些关键变量值的语句(如用disp)利用echo指令,使运行时,在屏幕上逐行显示文件内容。echo on能显示M脚本文件;echo FunName on能显示名为FunName的M函数文件。在程序适当位置加入keyboard指令。Matlab运行到这一指令时,会暂停执行,并在MatLab指令窗口中出现K提示符。此时用户可以输入指令查看各种变量的值,也可修改变量的值。输入回车后结束查看,原文件继续运行。,2023/11/8,35,调试器的使用,MatLab的调试器和M文件编辑器集成一体。,断点设置或清除dbstop/dbclear,清除全部断点(dbclear all),单步执行dbstep,深入被调函数(dbstep in),跳出被调函数(dbstep out),连续执行(dbcont),结束调试(dbquit),2023/11/8,36,调试器应用过程,根据要求编程,完成后自查是否有明显错误。初次运行程序,是否有错误提示。如果有,根据提示修改程序,如果没有,看结果是否正确。如果正确,恭喜!如果不正确,进行调试。首先找出可能出问题的代码段,设置断点。运行程序至断点处,观察相关变量的结果,分析是否正确。观察中间结果的方法有两种(1)变量值的鼠标观察法。(2)指令窗观察法。修改程序,重新运行。,2023/11/8,37,M文件编程举例,例一:用M文件编程实现从键盘逐个输入数据(input),然后判断输入的数是大于0还是小于0,并输出提示(使用disp函数)是正数(positive one)还是负数(negative one),同时记录输入的正数、负数的个数。当输入0时,终止此文件运行;当输入第10个数字时,显示记录的正数、负数个数并终止程序。解决步骤:(1)新建一个M文件(2)编写代码(3)保存,再调试运行,2023/11/8,38,例题2,将例一采用函数M文件实现,要求可以让用户指定终止程序的输入个数。function functionname(n)说明部分 函数体,2023/11/8,39,MatLab程序的性能优化,背景:MatLab采用解释执行编程语言。具有编程简单、使用方便等一系列优点,但运行速度慢是其主要缺点。如何是MatLab具有和C/Fortran相当的运算速度,一直是MathWorks公司追求的目标。MatLab6.5和以前版本的根本区别之一就是开始启用JIT(Just In Time)和加速器(Accelerator),从而使MatLab程序的运行速度可以和C/Fortran比肩。,2023/11/8,40,优化程序的步骤,找出耗时最多的程序“瓶颈”。用更好的程序取代“瓶颈”程序。主要讨论加快程序运行速度的措施,2023/11/8,41,提高MatLab运行速度的有效措施,循环的向量化 循环 k=0;for t=0:pi/20:2*pi;k=k+1;y(k)=cos(t);end应换成t=0:pi/20:2*pi;y=cos(t)尽可能采用MatLab提供的函数命令循环内数组的预配置 避免在循环体内频繁的动态配置数据。采用MEX文件执行循环尽量采用M函数文件替代M脚本文件尽量使用save load指令实施数据的保存和获取,