Download presentation
Presentation is loading. Please wait.
1
第六讲 MATLAB 语言程序设计 6.1 MATLAB语言的函数的基本结构 6.2 全局、局部变量、子函数与私有目录
6.8 例子与习题
2
6.1 MATLAB 语言函数的基本结构 MATLAB语言提供了两种源程序文件格式
M脚本文件:它实际上是MATLAB命令窗中一系列命令的组合,它没有输入输出参数传递的过程,它直接对工作区中的变量进行处理操作 M函数:这是MATLAB程序设计的主流,它可以传递参数及返回结果,我们主要介绍M函数的编写方法与技巧。
3
6.1 MATLAB 语言函数的基本结构 M函数是由 function 语句引导的,其基本格式如下
%中用命令 help 函数名 所得到的帮助就是这段文字。 输入、返回变量格式的检测 函数体语句 只要进入该函数,MATLAB就自动生成 nargin 和 nargout 两个变量,分别表示输入变量和输出变量的个数。程序中可以根据这两个变量的值来判断用户输入参数的情况。
4
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, SIGMA ni = nargin; no = nargout; ………………………. % end bode
5
6.1 MATLAB 语言函数的基本结构 说明 注释符号%引导的内容不能含空行,否则,后续的内容不能由 help 命令看到,大部分作者及版权信息都是空行后的注释内容。 当返回变量只有一个时,不用方框号[]括起来。 函数名与该函数存盘用的文件名要一样,否则MATLAB寻找的是文件名符合的函数,而且老版本的MATLAB不能用超过8个字符的函数名。
6
6.1 MATLAB 语言函数的基本结构 说明(续)
为了使得MATLAB认识该函数,要将该函数所在的目录用cd 命令设为当前目录,或用命令addpath添加到MATLAB的路径中去(也可以用MATLAB菜单下的PATH命令)。 可以用 type 函数名 来看函数文件的内容。 可以用 edit 函数名 来查看或编辑函数文件。
7
6.2 全局、局部变量、子函数与私有目录 MATLAB工作区中的变量和M函数内部的变量都是局部变量,他们是互不干扰的,但也可以显性地把变量定义为全局变量,使得他们在整个程序中都起作用。 全局变量定义格式为 global a b c d 注意变量之间不能用逗号分开,在MATLAB工作区和M 函数内部同时要声明该变量为全局变量。 为保证函数的独立性,一般情况下不建议使用全局变量。
8
6.2 全局、局部变量、子函数与私有目录 从MATLAB 5.0 开始引入子函数。所谓子函数就是一个函数文件中不但包含该函数本身,还包含专门由该函数调用的下一级函数,这样的专门函数称为子函数。子函数是不能有其他文件中的函数调用的。 私有目录即在当前的 MATLAB 目录下建立一个 private 子目录,该目录下的内容只能由当前目录下的函数调用,而不能有其他函数调用。
9
6.3 MATLAB函数的跟踪调试 用 MATLAB 自带的编辑器 EDIT编辑所要跟踪调试的程序,在希望的语句上设置断点,在MATLAB命令窗按正常方式运行命令,程序会自动停留在所设的断点处。 调试状态下,MATLAB命令窗的命令提示符变为 K>>。这时可输入任何MATLAB命令,变量为函数内部的局部变量,而不是工作区中的变量。 调试状态下,鼠标指针指向想查询的局部变量上将立即能显示出该变量值。
10
6.3 MATLAB函数的跟踪调试 跟踪调试程序中 Debug 菜单下的子菜单项的功能如下表 菜单项 执行结果
Set/Clear Breakpoint 设置或清除断点 Continue 继续执行到下一个断点 Step 单步执行 Step in 单步,若该步调用函数,则在该函数中也单步执行 Exit Debug Mode 退出调试状态
11
6.4 MATLAB工具箱编写技巧 将为某种专门目的编写一组 MATLAB 函数放在一个目录下,就形成了一个新的工具箱。
为了使得用户能象MATLAB提供的工具箱一样使用该工具箱,必须将该工具箱所在的目录用命令 addpath 添加到MATLAB的搜索路径中去。 为了能使得命令 help 工具箱名 能列出该工具箱的所有函数的功能介绍,应该按下述格式编写一个名为 contents.m 的文件。第一行给出工具箱名称,第二行给出版本信息,由命令 ver 工具箱名 可以获得该工具箱的版本信息。 一般在该工具箱下还有一文件 readme.m 用来存放有关该工具箱的版本升级信息,使用命令 whatsnew 工具箱名 查看的就是该文件的信息。
12
6.4 MATLAB工具箱编写技巧 >> type contents.m % Symbolic Math Toolbox.
% Version (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.
13
6.5 MATLAB语言的程序流程语句 循环语句结构 MATLAB 提供了循环语句结构、条件语句结构、开关语句结构以及试探语句。
for 循环变量 = s1:s2:s3 循环体语句组 end for 循环变量 = Vector 循环体语句组 end
14
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
15
6.5 MATLAB语言的程序流程语句 条件语句结构 if 条件式1 if 条件式1 条件块语句组1 条件块语句组1 elseif 条件式2
条件块语句组2 …… else 条件块语句组n+1 end if 条件式1 条件块语句组1 else 条件块语句组2 end
16
6.5 MATLAB语言的程序流程语句 条件语句结构 例二 例一 if a>0 if a>=0 a=1 a=1;
elseif a<0 a=-1 else a=0 end 例一 if a>=0 a=1; else a=-1; end
17
6.5 MATLAB语言的程序流程语句 开关结构 switch 开关表达式 case 表达式1 语句段1
case {表达式2,表达式3,…,表达式m} 语句段2 …… otherwise 语句段n end
18
6.6 MATLAB中新的数据结构 数据结构体 struct
从5.0版本开始,MATLAB 提供了几种新的数据结构类型,他们是数据结构体 struct,类 class和单元结构cell。 数据结构体 struct 与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_rec student_rec = number: 1 name: 'Ying' height: 165 test: [4x3 double]
19
6.6 MATLAB中新的数据结构 数据结构体 struct 引用成员变量 建立结构体类型的数组
>> student_rec.test ans = 建立结构体类型的数组 >> b(50,2)=struct(student_rec) b = 50x2 struct array with fields: number name height test
20
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=90 b = 50x2 struct array with fields: number name height test weight >> b=rmfield(b,'weight') b = 50x2 struct array with fields: number name height test
21
6.6 MATLAB中新的数据结构 类 class 类不但包含成员变量,还包含成员函数,我们通过一个例子来介绍类的构造,下面建立多项式类。
首先选定一个类的名字,如多项式类我们选为 polynom。 @polynom。该目录无需在MATLAB路径下再指定。
22
6.6 MATLAB中新的数据结构 polynom类的数据结构 polynom类的成员函数
多项式类只包含一个数据成员即 polynom类的成员函数 构造函数 polynom.m 多项式到双精度数的转换函数 多项式到字符串的转换函数 显示函数 A subsref method 重载运算符 +, -, 和 * 重载函数 roots, polyval, plot, 和 diff
23
6.6 MATLAB中新的数据结构 polynom类的构造函数 polynom.m 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(:).'; end >> p = polynom([ ]) p = polynom object: 1-by-1
24
6.6 MATLAB中新的数据结构 polynom类的转换函数 double.m polynom类的显示函数 display.m
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; >> double(p) ans = polynom类的显示函数 display.m function display(p) % POLYNOM/DISPLAY Command window display of a polynom disp(' '); disp([inputname(1),' = ']) disp([' ' char(p)]) >> display(p) p = x^3 - 2*x - 5
25
6.6 MATLAB中新的数据结构 polynom类重载+运算符 plus.m polynom类重载*运算符 mtimes.m
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类重载*运算符 mtimes.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));
26
6.6 MATLAB中新的数据结构 单元结构 cell 单元结构类似于数组,但单元结构中各元素可以是不同属性的数据,见下例。
>> a={1,'Ying',180,magic(3)} a = [1] 'Ying' [180] [3x3 double] >> a{4} ans = 访问单元数据要用带有大括号下标的形式,不能用圆括号。 可以使用 celldisp 函数来直接显示整个单元。 删除第n个单元元素用下面命令: a(n)=[]; 注意用圆括号。
27
6.6 MATLAB中新的数据结构 单元结构 cell应用 varargin 表示输入变量列表,是一个单元结构变量
varargout 表示输出变量列表,是一个单元结构变量 function a=convs(varargin) a=varargin{1}; for i=2:length(varargin) a=conv(a,varargin{i}); end >> p=[ ];q=[1 2];f=[1 2 3]; >> g=convs(p,q,f,[1 1],[1 3],[1 4]); g=
28
6.7 MATLAB语言编程技巧 MATLAB运行机制
判定这个名字是否为变量名 判定这个名字是否为本函数内部的子函数 判定这个名字是否为本目录下的私有目录内函数 判定这个名字是否为 MATLAB 的内在函数名 判定这个名字是否为 MATLAB 路径下的 Mex 型文件 判定这个名字是否为 MATLAB 路径下的 M 函数 MATLAB 搜索路径的顺序是按照其路径设定文件 pathdef.m 中的先后次序来进行的。
29
6.7 MATLAB语言编程技巧 MATLAB运行机制
用户可以用命令 exist 来查询当前的工作区下是否存在一个名字,其调用格式为: i=exist(字符串),例如 i=exist(‘A’); i=1,则表示当前工作区下存在变量 A i=2,则表示MALTAB工作路径下存在文件 A.m i=3,则表示MATLAB工作路径下存在文件 A.dll i=4,则表示表示存在 Simulink 文件 A.mdl i=5,则表示存在内部 MALTAB 函数 A( ) i=6,则表示MATLAB工作路径下存在伪代码文件 A.p i=7,则表示MATLAB工作路径下存在一个A子目录 i=0,则表示不存在任何和 A 有关的变量和文件
30
6.7 MATLAB语言编程技巧 测定程序执行时间和时间分配 tic 和 toc 是启动和停止秒表, cputime 获取 CPU时间
>> tic,t=cputime;a=hilb(1000);toc,cputime-t elapsed_time = ans = M 函数耗时剖析命令 profile profile on 待测函数名 profile report profile off
31
6.7 MATLAB语言编程技巧 加快MALTAB程序执行速度的建议 尽量避免使用循环 多重循环情况下,外循环次数要少 大型矩阵要预先定维
优先考虑内在函数 采用有效的算法 应用 Mex 技术
32
6.8 例子与习题 例一、分别用 for 和 while 循环结构编写程序,写出
并考虑一种避免循环的简洁方法来进行求和,并比较各种算法的运行时间。 例二、用循环语句形成一个有20个分量的数组,使其元素满足 Fibonacci 规则。
33
6.8 例子与习题 例三、考虑单元数组 B 的建立,判断下面的语句是否正确
>> B{1,2}='I Am A Student'; >> B{2,1}=180; >> B{2,2}=[ ; ; ; ]; 例四、自己编写一个 MATLAB 函数,是它能自动生成一个 mXm 的 Hankel 矩阵,并使其调用格式为 v=[h1, h2, ….h2n-1]; H=myhankel(v);
Similar presentations