MATLAB7.0程序设计.ppt
技术凝聚实力技术凝聚实力专业创新出版专业创新出版第15章 MATLAB7.0程序设计lMATLAB7.0拥有强大的数值计算和图形可视化功能。在之前的章节,用户主要是利用命令窗口和交互式对话框(如图形窗口)把想法和意图传递给机器,让系统执行操作。这种操作虽然比较便捷,但是只能解决代码行数少的简单问题,对于大型问题就显得捉襟见肘。针对此问题,MATLAB作为一种高级应用软件,还提供了特有的交互式的程序语言,即MATLAB语言。用户可以应用MATLAB语言编写扩展名为.m的文件,方便灵活地整合大量单行程序代码,从而解决大规模的工程问题。从广义上讲,在MATLAB命令窗口输入单行代码和利用其编程功能设计.m文件的程序都属于MATLAB的程序设计的不同方式,本章主要重点介绍后者,主要内容包括:M文件的特点和类型、变量、函数以及MATLAB程序结构和设计控制指令等程序设计的基本内容。针对程序的调试和优化将在本书第16章讲解。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1 M文件lM文件就是一系列相关代码组成的一个扩展名为.m的文件,用户可以在MATLAB自带的M文件编辑窗口或者普通文本编辑器中编写代码,然后以“filename的文件名+.m的后缀名”保存在MATLAB的工作空间,以后在MATLAB命令窗口直接调用文件名filename,就可以执行文件中一系列代码所综合表示的操作。l虽然M文件是简单的ASCII型的文本文件,但是其语法却与高级语言一样,是一种程序化的变成语编程语言言,所以,M文件具有简单、交互性较好和易于调试的特点。MATLAB之所以适用于多门学科,其重要原因是其具有类型齐全、功能完善的各种“工具箱(Toolbox)”,这些工具箱也都是一个个M文件,广大工程师和学者不断在工具箱内添加新的M文件,使MATLAB的功能越加增强。l本节主要介绍M文件的结构和分类、,以及如何运用M文件进行程序设计等知识。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1.1 M文件的结构lM文件是一个文本文件,用户可以通过单击MATLAB主界面【FileNewM-File】菜单选项或单击工具栏【New M-File】图标,新建一个M文件,在其中的第4行输入“这是一个新的M文件”,如图所示。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1.2 M文件分类lM文件可分为脚本文件(MATLAB scripts)和函数文件(MATLAB functions)。脚本文件是包含多条MATLAB命令的文件;函数文件可以包含输入变量,并把结果传送给输出变量。两者的简单介绍及区别如表所示。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1.3 脚本文件l脚本文件可以理解为较为简单的M文件,因为其没有输入和输出变量。下面用一个简单的例子说明如何编写和运行脚本文件。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1.4 函数文件l相对于脚本文件来说,函数文件稍显复杂。从外观上看来,函数文件只是在对应脚本文件的基础上,在文件中代码开始处多添加了一行函数定义行,函数文件都是以函数声明行“function”作为开始,其实质是:用户往MATLAB7.0函数库里边添加的子函数,即函数M文件中的变量都是局部变量,而非全局变量(除非使用特别形式声明),但是在函数运行期间失效,函数运行完毕之后,其定义的变量将从工作区间中清除,对于这一点,读者要注意和脚本文件的区别。而脚本文件只是将一系列相关代码结合封装,没有输入参数和输出参数,即不自带参数,也不一定要返回结果。而对于函数文件,尽管有一些函数文件不带参数,文件中一般使用一些全局变量来实现与外界和其他函数之间的数据交换,多数函数文件一般都有输入变量和输出变量,即自带参数,并见有返回结果,这样可以更好地把整个程序连为整体 技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.1.5 P码文件lM文件首次被MATLAB调用时,系统会首先对文件进行语法分析,并把生成的相关内部伪代码(Psedocode)文件存放于内存中,P码是伪代码(Psedocode)的缩写。当系统再次对该-文件进行调用时,将直接调用存放于内存中对应的P码文件,而不是再次对原M文件进行重复的分析。lP码文件和对应的M文件具有同样的文件名,但其却是以“.p”作为扩展名,对于用户输入的文件名,系统优先调用同名的P码文件,而且对于规模较大的文件,用户可以明显地感觉到,P码文件的执行速度比M文件高。虽然P码文件可以随着M文件的被调用而产生,但其不仅仅能作为M文件的“附属品”,也就是说用户可以预先创建P码文件并对内存中的P码文件进行操作。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2 变量l变量(variables)是MATLAB中的重要概念,与程序设计有密切关系。本节将系统介绍变量的相关知识,主要内容包括:变量的命名规则、MATLAB中特殊变量和关键字、变量的分类,不同类型变量的区别及使用范围、变量的检测传递以及变长度函数等。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2.1 命名变量lMATLAB中的变量不需要在使用前事先定义,但是必须遵循以下命名规则:l变量名区分大小写:HELLO和hello是不同的变量名,COS并不代表正弦函数;l变量名最多能包含63个字符,如超出限制,从第64个字符开始(包含),其后的字符都将被忽略;l变量名必须以字母开始,其后可以是任意数量的字母或下画线;l不允许出现标点符号,因为很多标点符号在MATLAB中有特殊的意义,如total name与total_name会产生完全不同的结果;系统也会认为total,,name由于逗号的分隔,不是一个变量。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2.2 MATLAB特殊变量lMATLAB预定义了若干特殊变量(Special Variables),这些变量具有系统默认的含义,如表所示。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2.3 MATLAB中关键字l关键字是MATLAB程序设计中常用的流程语句控制变量。MATLAB有17个系统关键字,在命令窗口输入指令iskeyword,就可以查询17个显示为蓝色的关键字:break,case,catch,continue,else,elseif,end,for,function,global,if,otherwise,persistent,return,switch,try,while。如果用户把这些关键字作变量名,MATLAB将会发出一条错误信息。如果用户一定要使用与这些关键字类似的词作为变量名,可以将这些关键字中的某个或者某些字母改成大写。l for=1000l?for=1000l|lError:The expression to the left of the equals sign is not a valid target for an assignment.l WHILE=1%WHILE和while含义不同,前者是用户定义变量,后者是关键字lWHILE=l 1技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2.4 不同类型的变量lMATLAB中的变量可分为以下3类。l局部变量(Local Variables):只在特定空间内定义且有意义的变量。l全局变量(Global Variables):在多个空间可以调用和传递的变量。l永久变量(Persistent Variables):只在函数文件中声明和调用,并在不同函数之间传递的变量。lMATLAB中,每一个函数有其独立的局部变量,这些临时定义的变量不被加载到MATLAB的工作空间中,与其他函数或是MATLAB基本工作空间中的变量互不影响。除非特别定义了全局变量或者永久变量,否则当函数结束调用结束时,所有局部变量将随之被擦除。脚本文件没有独立的工作空间,与其调用系统共用一个工作空间。当在MATLAB的命令窗口调用脚本文件时,共用MATLAB基本工作空间;而当在函数中调用时,则使用函数空间存储变量。所以当脚本文件使用空间中已存在的变量时,将改变变量的值。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.2.5 变量检测函数l为了提高用户传递参数的效率和进一步优化程序设计的流程,MATLAB提供了多种函数,用于变量检测、传递以及变长度输入输出变量。函数的调用格式和功能如下。lnargin:获取函数体内实际输入变量个数。lnargout:获取函数体内实际输出变量个数。lnargin(fun):获取函数“fun”中标称的输入变量个数。lnargout(fun):获取函数“fun”中标称的输出变量个数。linputname(n):获取函数体内第n个输入变量的实际调用变量名。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.3 函数l函数是MATLAB中的一个重要概念,例如绘图函数plot、mesh、peak,三角函数sin、cos、tan、cot等在之前的章节曾多次调用。调用函数执行某种操作是MATLAB的常用功能。函数的作用是使问题解决模块化,接受输入、输出参数,并返回结果。MATLAB7.0中创建和调用函数的方法有两种,一是命令窗口输入代码,另一个是编写M-函数文件。根据创建方法、调用方式以及功能的不同,函数可以进行分类,本节将介绍的不同函数类型的函数包括:匿名函数、主函数和子函数和嵌套函数。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.3.1 匿名函数l匿名函数是MATLAB函数的简易形式,这种函数没有函数名,且不是M文件,只包含一个MATLAB的表达式和输入、输出参数。用户可以直接在命令窗口输入代码,创建匿名函数。匿名函数的创建格式如下。lf=(arg1,arg2,.)expressionl其中f为创建的函数句柄,“arg1、arg2”为输入变量,“expression”为函数的主体表达式。l函数句柄是间接访问函数的手段,可以使用户调用函数变得简单,提高过程的效率和可靠性,避免或减少程序设计中的冗余,并在执行函数调用过程中保存相关信息。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.3.2 主函数与子函数lM文件方式存储的函数包含主函数(primary function)、子函数(subfunction)和嵌套函数(nested function)等。M文件可以包含任意多个函数,主函数是指M文件中的第一个函数。本书前面介绍的所有M文件都只包含一个函数,即所调用的函数都是主函数。子函数是除了主函数之外的函数,一个M文件可以有任意多个子函数,但是只能有一个主函数。l在MATLAB命令窗口或者其他M文件中,只可以对主函数进行调用,而对于子函数的调用,只局限于其所在M文件中的主函数和并列的子函数。在M文件中创建的子函数,需要单独声明,即要使一个子函数对应一个函数声明行。如果一个M文件中有多个子函数,那么这些子函数之间不存在优先级,都是并列关系,所以排列的前后顺序没有要求,子函数中的变量是独立的,除非特别声明为全局变量,否则不能被主函数和其他子函数所访问。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.3.3 嵌套函数l在MATLAB函数体内部定义函数,对于外部函数而言,此函数称为嵌套函数。嵌套函数是M文件函数的一种重要分支。嵌套函数在M文件内部定义,与一般主函数一样,其包括函数的所有基本组成部分,结束时必须用end标识。例如,下列代码中的主函数是A,A内嵌套了函数B,函数B的声明行为“function y=B(p3)”。lfunction x=A(p1,p2)l.function y=B(p3)l .l endl.lend技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4 程序结构及流控制语句l作为一种高级编程语言,MATLAB语言也提供了判断程序结构并控制程序运行的流程控制语句。一般来说MATLAN的程序按照大类,可以分为以下3种,其流程示意图如图所示。l顺序结构l循环结构l分支结构技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.1 顺序结构l顺序结构是MATLAB程序结构中最基本的结构,不需要任何流程控制语句,完全是依照自上而下的顺序进行代码的执行,用户熟知的批处理文件就是典型的顺序结构。一般的程序中,都要包含顺序结构。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.2 循环结构-for语句l循环结构一般用于规律性较强的运算,程序中被循环执行的语句称为循环体。MATLAB中的循环结构控制语句有for和while两种,都属于“当型循环控制语句”,即当条件m为“真”时,反复执行a语句,直到m为假为止,才停止循环,for循环语句的结构如下。lfor index=arrayl statements;lendl其中index表示循环变量,array一般是使用冒号进行步进的等差数列start:increment:end,stataements是循环体,最后是关键字end。for语句控制循环结构,循环次数一定,由array列数决定,即(end-start)/increment。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.3 循环结构-while语句lwhile是循环结构的另一常用语句,其格式如下。lwhile expressionl statements;lendl其中expression代表条件表达式,而statements表示执行的循环体,一般情况下,expression提供的是一个标量,有时也可以是数组。以expression是标量为例,只要其为“真(True)”,那么statements循环体就会一直循环下去,直到expression变为“假(False)”为止;而如果expression是一个数组,那么statements循环与否的条件则分别是数组所有元素均为“真”和不全为“真”。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.4 分支结构-if语句l与循环结构一样,分支结构也是程序设计中常见的结构之一。当程序需要表达选择意向的时候,用户往往需要使用条件分支控制语句。条件分支结构的执行顺序一般是,条件P为“真”时,执行语句A,否则,执行语句B,在执行完成任意分支后,输出结果。MATLAB中常见的条件分支控制语句有if和switch语句。lif语句常用于检查逻辑运算、逻辑函数等逻辑表达式的真假,若为真则继续执行下面的指令,其基本格式如下。lif conditional expressionl statements;lend技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.5 分支结构-switch语句lswitch语句也是MATLAB中常用的多分支结构语句,常用于针对某个变量的不同取值来进行不同的操作。与if多分支语句相比较而言,switch语句主要用于条件多且单一的情况,比如情况分类、层次结构计算等。switch条件分支语句的调用格式如下。switch expressionl case value1l statements1l case value2l statements2l case value3l statements3l.lotherwisel statementslend技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.6 纠错结构-try-catch语句l程序设计是出现错误和纠正错误的动态过程。try-catch语句用于对程序中的错误进行检测,如果发现右侧,系统会立即跳入到相应的catch语句中,执行纠错指令。try-catch语句的调用格式和功能如下。ltry%try模块l statementlcatch%catch模块l statementlend技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.7 跳出循环-continue语句lcontinue语句的功能是结束跳过程序中未执行的循环语句来结束循环。其调用格式十分简单,即直接输入continue。lContinue技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.4.8 结束循环-break语句lMATLAB程序设计中,break语句与continue语句功能类似,作用是终止本次循环,跳出最内层循环中所有剩下的语句,即根据条件而不必等到循环结束,便继续下一次循环。例如,查询300400之间第一个能被9整除的数。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5 交互控制指令lMATLAB程序在运行时,用户可以实时的控制其状态,包括键盘输入、暂停、终止操作、错误报警、指令查询等。本节针对这些功能,介绍MATLAB程序设计中的交互控制指令,包括input、keyboard、pause、return、warning、error、echo指令。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.1 输入控制-input指令linput指令的主要作用是提示用户在程序运行过程中向系统中输入参数(包括数据、字符串和表达式)。input指令的调用格式和具体功能如下:lvariable=input(prompt):在屏幕上显示提示信息“prompt”,等待用户输入,并把用户输入的值赋给变量variable;lvariable=input(prompt,s):返回字符串作为文本变量,而不是给变量赋一个名称或者数值。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.2 键盘控制-keyboard指令lkeyboard指令常用在程序调试和运行中的变量修改。系统执行keyboard指令时,将停止运行,显示提示符“K”,并把控制权交给键盘,等待用户的输入,显示如下。lKl当用户输入return指令,按“Enter”键,则控制权交回给程序,程序继续运行,显示如下。lK returnll说明:keyboard指令与input指令功能较为类似,不同的是,input指令只允许输入变量的值,而keyboard指令却允许用户输入多行MATLAB指令。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.3 暂停执行-pause指令lpause指令可以暂停或者终止程序的运行。执行pause指令时,系统暂停执行之前的操作,等待用户按任意键继续执行。pause指令常用于程序的调试过程中和用户需要查看程序执行的中间结果的时候,其调用格式和功能如下。lpause:暂停程序的执行,等待用户按任意键继续。lpause(n):暂停程序的执行,n秒后继续执行(n可以是分数)。lpause on:使后续的pause或者pause(n)指令予以执行。lpause off:使后续的pause或者pause(n)指令不予以执行。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.4 终止操作-return指令l同样是终止操作指令,break指令一般只用于循环体内部,而return指令可以在循环语句之外结束操作。return指令的用法比continue和break指令都要灵活,一般用在函数的末尾,MATLAB调用函数正在运行时,return指令可以强制结束,或者在满足某条件时强制退出此函数的运行,并返回主调函数或者键盘。正常情况下,程序于end指令处结束,使用return指令可以提前结束程序。例如,下列代码求向量相反数,当结果为1时,使用return指令退出循环。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.5 错误警告-warning指令lwarning指令与try-catch指令功能类似,都属于对MATLAB程序设计中的警告或错误情况进行捕获和处理的指令,常用于必要的错误提示,其调用格式如下。lwarning(message)l其中“message”表示显示的警告内容,出现警告时,程序继续进行。下面举例说明warning指令的用法。例如,在求两数的商时,如果0作为除数,使用错误警告机制。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.6 警告终止-error指令lerror指令的功能与warning指令类似,同样是针对程序中错误代码的报错显示,其常用调用格式和功能如下。lerror(message):其中“message”为显示的出错信息,此指令终止程序的执行。lerrordlg(errorstring,dlgname):显示出错信息的对话框,其中“errorstring”为对话框内容,而“dlgname”为对话框的标题。l例如,把上一节的警告指令换成报错终止指令。执行脚本,如果输入的除数为0,则系统给出警告信息,弹出交互式警告对话框,如图15.43所示。当用户单击对话框中的【OK】按钮,则代码终止运行,程序自动退出。lerrordlg(0 不能作为分母!,wrong entering data);技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.5.7 指令查询-echo指令l一般来说,用户在调用M文件,执行其中程序代码时,在命令窗口是看不到代码执行的具体过程的,而有时为了便于分析、演示和讲解,用户恰恰要对具体的运行过程,甚至每一行代码进行细致的了解。对于脚本文件和函数文件,echo指令的调用方式有一定的区别,对于脚本文件,其调用格式如下。echo on:显示其后所有执行文件的指令。lecho off:不显示其后所有执行文件的指令。echo:在上两种之间切换,变换显示状态。l而对于函数文件,echo指令的调用格式为。echo function_name on:显示名为“function_name”的文件中执行的指令。lecho function_name off:不显示名为“function_name”的文件中执行的指令。lecho on all:显示所有文件中执行的指令。echo off all:不显示所有文件中执行的指令。技术凝聚实力技术凝聚实力专业创新出版专业创新出版15.6 小结l本章主要介绍MATLAB语言和程序设计知识,通过本章学习,读者应该掌握如下的内容。lM文件的概念的应用l变量的命名和分类l特殊变量和关键字l变量检测函数l不同类型的函数l程序控制语句l交互控制指令