1、第七章 MATLAB程序设计,matlab语言及应用-第七章,主要内容,1、M文件 2、matlab控制流 3、matlab程序调试,7.1 M文件,1、MATLAB的M文件有两种(脚本文件和函数文件),脚本文件:将原来要在MATLAB环境直接输入的语句,放在一个以.m为后缀的文件中。,函数文件:它的第一行必须是函数定义行,用来标示其与脚本文件的不同,也存在.m文件中。,7.1 M文件,脚本文件的特点:,1.)它是一串按用户意图排列而成的(包括控制流 向指令在内的)MATLAB指令集合。,2.) 脚本文件运行后,所产生的所有变量都驻留在MATLAB基本空间(workspace)中。只要用户不使
2、用clear指令加以清除,且MATLAB指令窗不关闭,就可非常方便地从工作区中查询当前某个变量的计算情况。,7.1 M文件,函数文件的构成(由5个部分组成),(1)函数定义行(脚本文件无需定义行)位于函数文件的首行,以MATLAB关键字function开头,函数名以及函数的输入输出宗量都在这一行定义。function f,g=fname(x,y);,(2)函数信息说明行(H1)紧随函数定义行之后的以%开头的注释行的第一行。H1行包括:大写体的函数文件名;运用关键词简要描述的函数功能。H1行作用: 供look for 关键词查询和help帮助使用,(3)函数帮助文本H1行及其之后的连续以%开头的
3、所有注释行构成整个在线帮助文本。通常包括:函数输入输出宗量含义函数调用格式的说明,7.1 M文件,(4)函数体是指完成指定功能的MATLAB指令集合,它接收输入宗量,进行程序流控制,得到输出宗量。可调用任何可用的MATLAB提供的函数和用户自己定义的函数。,(5)注释是指在函数体中对某些程序行所进行的注释。以%标注,可以出现在函数体的任何需要的地方。,matlab语言及应用-第七章,举例演示,注释行,function y = mean(x)%MEAN Average or mean value. %For vectors, MEAN(X) is the mean value of X %For
4、 matrix, MEAN(X) is the row vector %containing the mean value of each column x=1 2 3;4 5 6;7 8 9; m,n=size(x) %The dimension of matrics X if m=1m=n; endy = sum(x)/m,函数定义行,H1行,帮助行,函数体,matlab语言及应用-第七章,m,n=size(x) ; %The dimension of matrics X if m=1m=n; endy = sum(x)/m,脚本文件,脚本文件和函数文件的比较,7.1 M文件,2、 函数工
5、作空间,每当函数文件运行时,matlab会为它开辟一个临时工作空间称之为函数工作空间。,说明: 1、函数工作空间相对于基本工作空间是独立的、临时的 2、函数工作空间随具体函数文件的调用而产生,随调用结束而删除 3、函数运行时产生的所有中间变量都存放在函数工作空间中 4、函数执行完成后,临时函数空间及所有的中间变量即被清除,7.1 M文件,3、 函数的输入、输出宗量,相同点:MATLAB中,函数的输入、输出变量的含义与C语言的函数相同。,异同点:实际调用时,所用的输入、输出变量的个数可以少于原定 义函数的变量的个数。,function sa=circle(r,s),7.1 M文件,nargin
6、nargout,在函数体内,用于获取实际输入宗量,在函数体内,用于获取实际输出宗量,function c=test(a,b) % test it is a check function if (nargin=1)c=a.2; elseif (nargin=2)c=a*b; end,x=1:3; y=1;2;3; test(x) test(x,y),7.1 M文件,4、 局部变量和全局变量,局部变量:是存在于函数工作空间内部的中间变量,产生于函数 的运行过程中,影响范围仅限于该函数本身。,全局变量:通过globle指令定义的变量,可以同时由几个不同的函数工作空间以及基本工作空间共享。,7.1 M
7、文件,5、 主函数和子函数,说明:1、与c语言相似,matlab中也可以定义子函数,来扩充函数的功能 2、子函数只能被主函数或同一主函数下的其它子函数所调用,定义:在函数文件中题头定义的函数被称为 主函数函数体内定义的其它函数均被视为 子函数,matlab语言及应用-第七章,function c=testarg(a,b)c=test1(a,b)*test2(a,b);function c=test1(a,b)c=a+b;function c=test2(a,b)c=a-b;,%主函数,%子函数1,%子函数2,7.1 M文件,6、P码文件,在一个M文件首次被调用时,MATLAB将首先对该M文件进
8、行语法分析,并生成相应的内部伪代码文件存放在内存中。,简称P码,说明: 1、P码文件与原码文件有相同的文件名,但其扩展名为“.P” 2、P码文件的运行速度高于原码文件。,pcode funname pcode funname-inplace inmem clear funname clear functions,7.2 matlab控制流,matlab提供了五种控制程序流的结构:for 循环结构while 循环结构if-else-end分支结构switch-case 结构try-catch 结构,条件控制语句,7.2 matlab控制流,1.if-else-end分支结构,条件控制语句。,(1
9、)单分支if expressioncommandsend,如果表达式expression为真,执行组 命令commands,否则跳过该组命令。,例: 假设定义mn的矩阵A。下面的语句是判断 矩阵A的第1列元素是否为0,若全为0,则从矩阵A中删除第1列。,if A(:,1)=0m,n=size(A);A=A(1:m,2:n); end,7.2 matlab控制流,(2)双分支 if expression 判决条件commands1 表达式为真时,执行命令commands1 elsecommands2 表达式为假时,执行命令commands2 end,7.2 matlab控制流,判决表达式2,(3
10、)多分支if expression1 commands1 elseif expression2commands2 elsecommandsk end,判决表达式1,表达式1为真,执行commands1,结束此结构,表达式1为假,而表达2为真, 执行commands2,结束此结构,当前面所有表达式均为假时,执行该组命令,说明:表达式为空时,MATLAB认为表达式为假。,matlab语言及应用-第七章,例:if n0disp(input n must be positive.)elseif n=0 disp(n=0)elseif rem(n,2)=0 disp(n是2的整数倍)elsedisp(其
11、它情况)end,7.2 matlab控制流,2.switch-case结构,条件控制语句,switch excase test1commands1case test2commands2case testkcommandskotherwisecommands end,ex为一标量或字符串,当ex等于test1时,执行组命令1, 然后跳出该结构,当ex等于testk时,执行组命令k, 然后跳出该结构,当表达式不等于前面所有的检测值时, 则执行改组命令,matlab语言及应用-第七章,function dicetest(result)switch resultcase 1,3,5disp(odd n
12、umber of eye)case 2,4,6disp(even number of eye)otherwisedisp(what kind of dice do you have?) end,说明:case后的检测值可以是标量、字符串和元胞数组若检测值是元胞数组,matlab将表达式的值和元胞数组中的所有值进行比较,只要元胞数组中有一个元素与表达式的值相等,则认为比较结果为真。,检测掷一次骰子所得的 点数是单数还是双数,7.2 matlab控制流,3. try-catch 结构,条件控制语句,try commands1 catchcommands2 end,执行commands1,若正确,则
13、跳出此结构,若执行commands1时出现错误,则执行commands2,matlab语言及应用-第七章,N=4; A=rand(3); tryA_N=A(N,:); catchA_end=A(end,:); endlasterr,显示最新出错信息,并终止程序,%如果取A(N,:)出错,则改取A的最后一行,7.2 matlab控制流,4.指定重复次数的循环语句,for variable=expressionstatements end,说明: 在for和variable之间需要有一个空格。 这里的variable e是循环变量名。 在表达式中给出循环的初始值、步长和终值。,功能: 这个命令就是
14、反复执行一条语句或一组语句, 而执行的次数已预先定义好。以end结束这组语句,7.2 matlab控制流,5.不指定重复次数的循环语句,说明:无论是for循环还是while循环均可用break语句终止循环。,while expressioncommands end,功能:只要逻辑表达式为真, while命令将反复执行程序语句。,matlab语言及应用-第七章,举例:在区间2 ,0.75 内,步长为0.25,对函数y=f(x) = 1 + 1 /x求值,并列表。将所得x值和y值分别存入向量r和s中,并列表显示。,r=; s=; for x=-2.0:0.25:-0.75;y=1+1/x;r=r
15、x;s=s y; endr;s,matlab语言及应用-第七章,var=1 2 3 4 5 6 -1 7 8 0 ; a=; k=1; while var(k)if var(k)=-1break;enda=a var(k).2;k=k+1; end disp(a),例题开讲,不必等到循环自然结束,而 是根据循环另设的条件来判 断是否跳出循环,7.2 matlab控制流,控制流的其它常用指令:,1、利用input函数输入参数,并可同时显示出提示信息,2、利用keyboard函数进入键盘主控状态,直接修改或输入变量;,3、 pause error和warning指令,7.2 matlab控制流,1
16、.用 input ( ) 函数输入参数,(1)当输入参数是数值时:y=input(x=);f=input(frequency is : );,说明: 这里的input函数与c语言中的不同 它不需要对输入参数的类型进行说明。如:%f,%d.,在指令窗的工作区中会显示提示信息,7.2 matlab控制流,(2)当直接输入字符串变量时:需要用s选项对其进行类型说明。y=input(methods:,s);,(3)当直接输入表达式时:这时先计算表达式的值,然后将值赋给变量。,a=5; b=4; c=input(please input a2+b:),7.2 matlab控制流,2.键盘控制 keybo
17、ard,说明: 1、遇到keyboard时,将“控制权”交给键盘,用户可以从键盘输入各种matlab指令。2、仅当用户输入return指令后,“控制权”才交还给程序,keyboard m,n=size(x); if m=1m=n; endy = sum(x)/m,7.2 matlab控制流,3、pause、error和warning指令,pause pause(n),暂停执行文件,等待用户按任意键后继续,暂停执行文件n秒,在继续执行,t=0:2*pi/99:2*pi; x=1.15*cos(t);y=3.25*sin(t); plot(x,y),axis normal,grid on, tit
18、le(Normal and Grid on) disp(以上是轴的通常设置。) disp(按任意键继续!下面是X-Y轴刻度等长度设置情况。) pause plot(x,y),axis equal,grid on,title(Equal),7.2 matlab控制流,error(message)lasterr warning(message) lastwarn,显示出错信息message,并终止程序,显示matlab自动判断的最新出错原因,并终止程序,显示警告信息message,程序继续运行,显示matlab自动给出的最新警告信息,并继续运行,matlab语言及应用-第七章,N=4; A=ran
19、d(3); tryA_N=A(N,:); catchA_end=A(end,:); end lasterr,7.3 程序的调试,所谓的程序调试,就是指当发现你所编制的程序无法得到你所期望的结果时,所进行的错误修正。,一般情况下的程序错误可以分为两类,(1)格式错误这类错误比较容易定位和检查。,(2)运行错误这类错误通常是因为逻辑或算法上有问题而导致的错误,这类问题比较不容易到。,7.3 程序的调试,错误的识别:,将程序每一步执行的结果输出到命令窗口,以检查运行的结果;实现方法:将程序中屏蔽输出的“;”去掉。,在m文件中可能发生错误的地方加入keyboard, 让MATLAB程序暂停来检查相关的
20、信息。,注释掉函数的定义行,将其转换成脚本文件, 对其中的信息进行进行观测。,用MATLAB提供的调试器debugger来检查错误。,7.3 程序的调试,下面我们介绍如何利用调试器(debugger)进行MATLAB的程序调试。,启动debugger:(三种方法),7.3 程序的调试,程序的调试过程:,A.设置断点设置断点的目的是让程序在断点处暂停下来,分段分析程序是否在某段中正确。,B.检查运行结果在工作区中调用函数,会执行该程序并在断点处停下来,你可以键入所需要检查的变量名。,C.调试被嵌套的函数先将外层函数的断点去掉换到有问题的子函数中设置断点,并可在里面设置单步执行方式,对其正误进行检
21、查。,7.3 程序的调试,7.3 程序的调试,dbstopdbstatusdbtypedbstepdbquit,用来在M文件中设置断点 调用格式:dbstop in at ,显示断点信息,显示M文件文本(包括行号),从断点出继续执行文件,退出调试状态,matlab语言及应用-第七章,%function C=dbtest(A,B) A=1 2 ;3 4;B=5 6;7 8 num11,num12=size(A); num21,num22=size(B); if (num12=num21)C=A*B; elseif (num11=num22)C=B*A;elseerror(input error!)end end return,