MATLAB语言程序设计.ppt
第六讲 MATLAB 语言程序设计,6.1 MATLAB语言的函数的基本结构6.2 全局、局部变量、子函数与私有目录6.3 MATLAB 函数的跟踪调试6.4 MATLAB工具箱编写技巧6.5 MATLAB语言的程序流程语句6.6 MATLAB中新的数据结构6.7 MATLAB 语言编程技巧6.8 例子与习题,6.1 MATLAB 语言函数的基本结构,MATLAB语言提供了两种源程序文件格式,M脚本文件:它实际上是MATLAB命令窗中一系列命令的组合,它没有输入输出参数传递的过程,它直接对工作区中的变量进行处理操作,M函数:这是MATLAB程序设计的主流,它可以传递参数及返回结果,我们主要介绍M函数的编写方法与技巧。,6.1 MATLAB 语言函数的基本结构,M函数是由 function 语句引导的,其基本格式如下,function 返回变量列表函数名(输入变量列表)由该符号引导的注释语句段,在MATLAB命令窗中用命令 help 函数名 所得到的帮助就是这段文字。输入、返回变量格式的检测函数体语句,只要进入该函数,MATLAB就自动生成 nargin 和 nargout 两个变量,分别表示输入变量和输出变量的个数。程序中可以根据这两个变量的值来判断用户输入参数的情况。,6.1 MATLAB 语言函数的基本结构,M函数典型例子,function magout,phase,w=bode(a,b,c,d,iu,w)%BODE Bode frequency response of LTI models.%BODE(SYS)draws the Bode plot of the LTI model SYS(created with%either TF,ZPK,SS,or FRD).The frequency range and number of%points are chosen automatically.%See also BODEMAG,NICHOLS,NYQUIST,SIGMAni=nargin;no=nargout;.%end bode,6.1 MATLAB 语言函数的基本结构,说明,注释符号引导的内容不能含空行,否则,后续的内容不能由 help 命令看到,大部分作者及版权信息都是空行后的注释内容。,当返回变量只有一个时,不用方框号括起来。,函数名与该函数存盘用的文件名要一样,否则MATLAB寻找的是文件名符合的函数,而且老版本的MATLAB不能用超过8个字符的函数名。,6.1 MATLAB 语言函数的基本结构,说明(续),可以用 type 函数名 来看函数文件的内容。,可以用 edit 函数名 来查看或编辑函数文件。,为了使得MATLAB认识该函数,要将该函数所在的目录用cd 命令设为当前目录,或用命令addpath添加到MATLAB的路径中去(也可以用MATLAB菜单下的PATH命令)。,6.2 全局、局部变量、子函数与私有目录,MATLAB工作区中的变量和M函数内部的变量都是局部变量,他们是互不干扰的,但也可以显性地把变量定义为全局变量,使得他们在整个程序中都起作用。,全局变量定义格式为 global a b c d注意变量之间不能用逗号分开,在MATLAB工作区和M函数内部同时要声明该变量为全局变量。,为保证函数的独立性,一般情况下不建议使用全局变量。,6.2 全局、局部变量、子函数与私有目录,从MATLAB 5.0 开始引入子函数。所谓子函数就是一个函数文件中不但包含该函数本身,还包含专门由该函数调用的下一级函数,这样的专门函数称为子函数。子函数是不能有其他文件中的函数调用的。,私有目录即在当前的 MATLAB 目录下建立一个 private 子目录,该目录下的内容只能由当前目录下的函数调用,而不能有其他函数调用。,6.3 MATLAB函数的跟踪调试,用 MATLAB 自带的编辑器 EDIT编辑所要跟踪调试的程序,在希望的语句上设置断点,在MATLAB命令窗按正常方式运行命令,程序会自动停留在所设的断点处。,调试状态下,MATLAB命令窗的命令提示符变为 K。这时可输入任何MATLAB命令,变量为函数内部的局部变量,而不是工作区中的变量。,调试状态下,鼠标指针指向想查询的局部变量上将立即能显示出该变量值。,6.3 MATLAB函数的跟踪调试,跟踪调试程序中 Debug 菜单下的子菜单项的功能如下表,6.4 MATLAB工具箱编写技巧,将为某种专门目的编写一组 MATLAB 函数放在一个目录下,就形成了一个新的工具箱。为了使得用户能象MATLAB提供的工具箱一样使用该工具箱,必须将该工具箱所在的目录用命令 addpath 添加到MATLAB的搜索路径中去。为了能使得命令 help 工具箱名 能列出该工具箱的所有函数的功能介绍,应该按下述格式编写一个名为 contents.m 的文件。第一行给出工具箱名称,第二行给出版本信息,由命令 ver 工具箱名 可以获得该工具箱的版本信息。一般在该工具箱下还有一文件 readme.m 用来存放有关该工具箱的版本升级信息,使用命令 whatsnew 工具箱名 查看的就是该文件的信息。,6.4 MATLAB工具箱编写技巧,type contents.m%Symbolic Math Toolbox.%Version 2.1.2(R12.1)11-Sep-2000%New Features.%Readme-Overview of the new features in/changes made to%the Symbolic and Extended Symbolic Math Toolboxes.%Calculus.%diff-Differentiate.%Linear Algebra.%poly-Characteristic polynomial.%Simplification.%simplify-Simplify.%Solution of Equations.%solve-Symbolic solution of algebraic equations.%Variable Precision Arithmetic.%vpa-Variable precision arithmetic.,6.5 MATLAB语言的程序流程语句,MATLAB 提供了循环语句结构、条件语句结构、开关语句结构以及试探语句。,for 循环变量=s1:s2:s3 循环体语句组end,循环语句结构,for 循环变量=Vector 循环体语句组end,6.5 MATLAB语言的程序流程语句,例一、t=0;for i=1:1:100;t=t+i;end,循环语句结构,例二、w=0.1:0.05:1,1.5:0.5:10,15:5:100,150:50:1000;a=0 1;-1 2;b=0;1;c=1 2;d=0;m=;I=eye(size(A);for i=w,m=m;C*inv(sqrt(-1)*I*I-A)*B+D);end,6.5 MATLAB语言的程序流程语句,条件语句结构,if 条件式1 条件块语句组1else 条件块语句组2end,if 条件式1 条件块语句组1elseif 条件式2 条件块语句组2else 条件块语句组n+1end,6.5 MATLAB语言的程序流程语句,条件语句结构,例一if a=0 a=1;else a=-1;end,例二if a0 a=1elseif a0 a=-1else a=0end,6.5 MATLAB语言的程序流程语句,开关结构,switch 开关表达式case 表达式1 语句段1case 表达式2,表达式3,表达式m 语句段2 otherwise 语句段nend,6.6 MATLAB中新的数据结构,数据结构体 struct,从5.0版本开始,MATLAB 提供了几种新的数据结构类型,他们是数据结构体 struct,类 class和单元结构cell。,与C语言不同,MATLAB中数据结构类型的变量不用定义一个结构体先,直接用就可以,如下例。,student_rec.number=1;student_rec.name=Ying;student_rec.height=165;student_rec.test=100,80,75;77,60,92;67,28,80;100,89,78;student_recstudent_rec=number:1 name:Ying height:165 test:4x3 double,6.6 MATLAB中新的数据结构,数据结构体 struct,引用成员变量,student_rec.testans=100 80 75 77 60 92 67 28 80 100 89 78,建立结构体类型的数组,b(50,2)=struct(student_rec)b=50 x2 struct array with fields:number name height test,6.6 MATLAB中新的数据结构,数据结构体 struct,修改结构数值元素的取值,增加结构体成员,b(43,2).number=50+43;b(43,2).name=Gan;b(43,2).height=156;b(43,2).test=83,80,78;97,80,62;90,20,30;30,20,80;,b(1,1).weight=90b=50 x2 struct array with fields:number name height test weight,删除结构体成员,b=rmfield(b,weight)b=50 x2 struct array with fields:number name height test,6.6 MATLAB中新的数据结构,类 class,类不但包含成员变量,还包含成员函数,我们通过一个例子来介绍类的构造,下面建立多项式类。,首先选定一个类的名字,如多项式类我们选为 polynom。以这个名字在当前目录下建立一个子目录,而且要加符号,即建立子目录 polynom。该目录无需在MATLAB路径下再指定。,6.6 MATLAB中新的数据结构,polynom类的数据结构,多项式类只包含一个数据成员即 p.c,它即是多项式系数,幂次从高到底。该成员变量只能被 polynom目录下的成员函数访问。,polynom类的成员函数,构造函数 polynom.m多项式到双精度数的转换函数多项式到字符串的转换函数显示函数A subsref method重载运算符+,-,和*重载函数 roots,polyval,plot,和 diff,function p=polynom(a)%POLYNOM Polynomial class constructor.%p=POLYNOM(v)creates a polynomial object from the vector v,%containing the coefficients of descending powers of x.if nargin=0 p.c=;p=class(p,polynom);elseif isa(a,polynom)p=a;else p.c=a(:).;p=class(p,polynom);end,6.6 MATLAB中新的数据结构,polynom类的构造函数 polynom.m,p=polynom(1 0-2-5)p=polynom object:1-by-1,6.6 MATLAB中新的数据结构,function c=double(p)%POLYNOM/DOUBLE Convert polynom object to coefficient vector.%c=DOUBLE(p)converts a polynomial object to the vector c%containing the coefficients of descending powers of x.c=p.c;,polynom类的转换函数 double.m,function display(p)%POLYNOM/DISPLAY Command window display of a polynomdisp();disp(inputname(1),=)disp();disp(char(p)disp();,polynom类的显示函数 display.m,double(p)ans=1 0-2-5,display(p)p=x3-2*x-5,6.6 MATLAB中新的数据结构,function r=plus(p,q)%POLYNOM/PLUS Implement p+q for polynoms.p=polynom(p);q=polynom(q);k=length(q.c)-length(p.c);r=polynom(zeros(1,k)p.c+zeros(1,-k)q.c);,polynom类重载运算符 plus.m,function r=mtimes(p,q)%POLYNOM/MTIMES Implement p*q for polynoms.p=polynom(p);q=polynom(q);r=polynom(conv(p.c,q.c);,polynom类重载*运算符 mtimes.m,6.6 MATLAB中新的数据结构,单元结构 cell,单元结构类似于数组,但单元结构中各元素可以是不同属性的数据,见下例。,访问单元数据要用带有大括号下标的形式,不能用圆括号。可以使用 celldisp 函数来直接显示整个单元。删除第n个单元元素用下面命令:a(n)=;注意用圆括号。,a=1,Ying,180,magic(3)a=1 Ying 180 3x3 double a4ans=8 1 63 5 7 4 9 2,6.6 MATLAB中新的数据结构,单元结构 cell应用,varargin 表示输入变量列表,是一个单元结构变量varargout 表示输出变量列表,是一个单元结构变量,function a=convs(varargin)a=varargin1;for i=2:length(varargin)a=conv(a,varargini);end,p=1 2 4 0 5;q=1 2;f=1 2 3;g=convs(p,q,f,1 1,1 3,1 4);g=1 11 56 176 376 578 678 648 527 315 90,6.7 MATLAB语言编程技巧,MATLAB运行机制,MATLAB 语言在函数调用中或文件执行时,如果遇到了某一个名字,则按照下面的优先级顺序对这个名字进行判定。,判定这个名字是否为变量名判定这个名字是否为本函数内部的子函数判定这个名字是否为本目录下的私有目录内函数判定这个名字是否为 MATLAB 的内在函数名判定这个名字是否为 MATLAB 路径下的 Mex 型文件判定这个名字是否为 MATLAB 路径下的 M 函数,MATLAB 搜索路径的顺序是按照其路径设定文件 pathdef.m 中的先后次序来进行的。,6.7 MATLAB语言编程技巧,MATLAB运行机制,用户可以用命令 exist 来查询当前的工作区下是否存在一个名字,其调用格式为:i=exist(字符串),例如 i=exist(A);,i=1,则表示当前工作区下存在变量 Ai=2,则表示MALTAB工作路径下存在文件 A.mi=3,则表示MATLAB工作路径下存在文件 A.dlli=4,则表示表示存在 Simulink 文件 A.mdli=5,则表示存在内部 MALTAB 函数 A()i=6,则表示MATLAB工作路径下存在伪代码文件 A.pi=7,则表示MATLAB工作路径下存在一个A子目录i=0,则表示不存在任何和 A 有关的变量和文件,6.7 MATLAB语言编程技巧,测定程序执行时间和时间分配,tic 和 toc 是启动和停止秒表,cputime 获取 CPU时间,tic,t=cputime;a=hilb(1000);toc,cputime-telapsed_time=0.7030ans=0.7500,M 函数耗时剖析命令 profile,profile on待测函数名profile reportprofile off,6.7 MATLAB语言编程技巧,加快MALTAB程序执行速度的建议,尽量避免使用循环多重循环情况下,外循环次数要少大型矩阵要预先定维优先考虑内在函数采用有效的算法应用 Mex 技术,6.8 例子与习题,例一、分别用 for 和 while 循环结构编写程序,写出并考虑一种避免循环的简洁方法来进行求和,并比较各种算法的运行时间。,例二、用循环语句形成一个有20个分量的数组,使其元素满足 Fibonacci 规则。,6.8 例子与习题,例三、考虑单元数组 B 的建立,判断下面的语句是否正确,例四、自己编写一个 MATLAB 函数,是它能自动生成一个 mXm 的 Hankel 矩阵,并使其调用格式为 v=h1,h2,.h2n-1;H=myhankel(v);,B1,1=1;B1,2=I Am A Student;B2,1=180;B2,2=100 80 75;77 60 92;67 68 90;100 89 78;,