Transcript
Page 1: 第六讲  MATLAB  语言程序设计

第六讲 第六讲 MATLAB MATLAB 语言程序设语言程序设计计

6.1 MATLAB 语言的函数的基本结构6.2 全局、局部变量、子函数与私有目录6.3 MATLAB 函数的跟踪调试6.4 MATLAB 工具箱编写技巧6.5 MATLAB 语言的程序流程语句6.6 MATLAB 中新的数据结构6.7 MATLAB 语言编程技巧6.8 例子与习题

Page 2: 第六讲  MATLAB  语言程序设计

6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构MATLAB 语言提供了两种源程序文件格式

• M 脚本文件:它实际上是 MATLAB 命令窗中一系列命令的组合,它没有输入输出参数传递的过程,它直接对工作区中的变量进行处理操作

• M 函数:这是 MATLAB 程序设计的主流,它可以传递参数及返回结果,我们主要介绍 M 函数的编写方法与技巧。

Page 3: 第六讲  MATLAB  语言程序设计

6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构

M 函数是由 function 语句引导的,其基本格式如下

function [返回变量列表]=函数名(输入变量列表)%由该符号引导的注释语句段,在 MATLAB 命令窗%中用命令 help 函数名 所得到的帮助就是这段文字。输入、返回变量格式的检测函数体语句

只要进入该函数, MATLAB 就自动生成 nargin 和 nargout

两个变量,分别表示输入变量和输出变量的个数。程序中可以根据这两个变量的值来判断用户输入参数的情况。

Page 4: 第六讲  MATLAB  语言程序设计

6.1 MATLAB 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

Page 5: 第六讲  MATLAB  语言程序设计

6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构

说明

• 注释符号%引导的内容不能含空行,否则,后续的内容不能由 help 命令看到,大部分作者及版权信息都是空行后的注释内容。

• 当返回变量只有一个时,不用方框号[]括起来。

• 函数名与该函数存盘用的文件名要一样,否则 MATLAB

寻找的是文件名符合的函数,而且老版本的 MATLAB 不能用超过 8 个字符的函数名。

Page 6: 第六讲  MATLAB  语言程序设计

6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构

说明(续)

• 可以用 type 函数名 来看函数文件的内容。

• 可以用 edit 函数名 来查看或编辑函数文件。

• 为了使得 MATLAB 认识该函数,要将该函数所在的目录用 cd 命令设为当前目录,或用命令 addpath 添加到 MAT

LAB 的路径中去(也可以用 MATLAB 菜单下的 PATH 命令)。

Page 7: 第六讲  MATLAB  语言程序设计

6.2 6.2 全局、局部变量、子函数与私有目全局、局部变量、子函数与私有目录录

• MATLAB 工作区中的变量和 M 函数内部的变量都是局部变量,他们是互不干扰的,但也可以显性地把变量定义为全局变量,使得他们在整个程序中都起作用。

• 全局变量定义格式为 global a b c d

注意变量之间不能用逗号分开,在 MATLAB 工作区和 M

函数内部同时要声明该变量为全局变量。

• 为保证函数的独立性,一般情况下不建议使用全局变量。

Page 8: 第六讲  MATLAB  语言程序设计

6.2 6.2 全局、局部变量、子函数与私有目全局、局部变量、子函数与私有目录录

• 从 MATLAB 5.0 开始引入子函数。所谓子函数就是一个函数文件中不但包含该函数本身,还包含专门由该函数调用的下一级函数,这样的专门函数称为子函数。子函数是不能有其他文件中的函数调用的。

• 私有目录即在当前的 MATLAB 目录下建立一个 private

子目录,该目录下的内容只能由当前目录下的函数调用,而不能有其他函数调用。

Page 9: 第六讲  MATLAB  语言程序设计

6.3 MATLAB6.3 MATLAB 函数的跟踪调试函数的跟踪调试

• 用 MATLAB 自带的编辑器 EDIT 编辑所要跟踪调试的程序,在希望的语句上设置断点,在 MATLAB 命令窗按正常方式运行命令,程序会自动停留在所设的断点处。

• 调试状态下, MATLAB 命令窗的命令提示符变为 K>> 。这时可输入任何MATLAB 命令,变量为函数内部的局部变量,而不是工作区中的变量。

• 调试状态下,鼠标指针指向想查询的局部变量上将立即能显示出该变量值。

Page 10: 第六讲  MATLAB  语言程序设计

6.3 MATLAB6.3 MATLAB 函数的跟踪调试函数的跟踪调试

• 跟踪调试程序中 Debug 菜单下的子菜单项的功能如下表

菜单项 执行结果Set/Clear Breakpoint

设置或清除断点

Continue 继续执行到下一个断点Step 单步执行Step in 单步,若该步调用函数,则在该

函数中也单步执行Exit Debug Mode 退出调试状态

Page 11: 第六讲  MATLAB  语言程序设计

6.4 MATLAB6.4 MATLAB 工具箱编写技巧工具箱编写技巧• 将为某种专门目的编写一组 MATLAB 函数放在一个目录

下,就形成了一个新的工具箱。• 为了使得用户能象MATLAB 提供的工具箱一样使用该工

具箱,必须将该工具箱所在的目录用命令 addpath 添加到MATLAB 的搜索路径中去。

• 为了能使得命令 help 工具箱名 能列出该工具箱的所有函数的功能介绍,应该按下述格式编写一个名为 contents.m

的文件。第一行给出工具箱名称,第二行给出版本信息,由命令 ver 工具箱名 可以获得该工具箱的版本信息。

• 一般在该工具箱下还有一文件 readme.m 用来存放有关该工具箱的版本升级信息,使用命令 whatsnew 工具箱名 查看的就是该文件的信息。

Page 12: 第六讲  MATLAB  语言程序设计

6.4 MATLAB6.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.

Page 13: 第六讲  MATLAB  语言程序设计

6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句

MATLAB 提供了循环语句结构、条件语句结构、开关语句结构以及试探语句。

for 循环变量 = s1:s2:s3

循环体语句组end

循环语句结构

for 循环变量 = Vector

循环体语句组end

Page 14: 第六讲  MATLAB  语言程序设计

6.5 MATLAB6.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

Page 15: 第六讲  MATLAB  语言程序设计

6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句条件语句结构

if 条件式 1

条件块语句组 1

else

条件块语句组 2

end

if 条件式 1

条件块语句组 1

elseif 条件式 2

条件块语句组 2

……

else

条件块语句组 n+1

end

Page 16: 第六讲  MATLAB  语言程序设计

6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句条件语句结构

例一if a>=0

a=1;

else

a=-1;

end

例二if a>0

a=1

elseif a<0

a=-1

else

a=0

end

Page 17: 第六讲  MATLAB  语言程序设计

6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句开关结构

switch 开关表达式case 表达式 1

语句段 1

case {表达式 2 ,表达式 3 ,…,表达式 m} 语句段 2

……

otherwise

语句段 n

end

Page 18: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.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]

Page 19: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.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 = 50x2 struct array with fields: number name height test

Page 20: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.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 = 50x2 struct array with fields: number name height test weight

删除结构体成员>> b=rmfield(b,'weight')b = 50x2 struct array with fields: number name height test

Page 21: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构类 class

类不但包含成员变量,还包含成员函数,我们通过一个例子来介绍类的构造,下面建立多项式类。

1. 首先选定一个类的名字,如多项式类我们选为 polynom 。2. 以这个名字在当前目录下建立一个子目录,而且要加符号

@ ,即建立子目录 @polynom 。该目录无需在 MATLAB

路径下再指定。

Page 22: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构polynom类的数据结构多项式类只包含一个数据成员即 p.c ,它即是多项式系数,幂次从高到底。该成员变量只能被 @polynom 目录下的成员函数访问。

polynom类的成员函数• 构造函数 polynom.m

• 多项式到双精度数的转换函数• 多项式到字符串的转换函数• 显示函数• A subsref method

• 重载运算符 +, -, 和 *

• 重载函数 roots, polyval, plot, 和 diff

Page 23: 第六讲  MATLAB  语言程序设计

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 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构

polynom类的构造函数 polynom.m

>> p = polynom([1 0 -2 -5])

p = polynom object: 1-by-1

Page 24: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.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 = x^3 - 2*x - 5

Page 25: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.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

Page 26: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构单元结构 cell

单元结构类似于数组,但单元结构中各元素可以是不同属性的数据,见下例。

1. 访问单元数据要用带有大括号下标的形式,不能用圆括号。2. 可以使用 celldisp 函数来直接显示整个单元。3. 删除第 n 个单元元素用下面命令: a(n)=[]; 注意用圆括号。

>> a={1,'Ying',180,magic(3)}a = [1] 'Ying' [180] [3x3 double]>> a{4}ans = 8 1 6

3 5 7 4 9 2

Page 27: 第六讲  MATLAB  语言程序设计

6.6 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构单元结构 cell应用varargin 表示输入变量列表,是一个单元结构变量varargout 表示输出变量列表,是一个单元结构变量

function a=convs(varargin)a=varargin{1};for i=2:length(varargin) a=conv(a,varargin{i});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

Page 28: 第六讲  MATLAB  语言程序设计

6.7 MATLAB6.7 MATLAB 语言编程技巧语言编程技巧MATLAB运行机制MATLAB 语言在函数调用中或文件执行时,如果遇到了某一个名字,则按照下面的优先级顺序对这个名字进行判定。• 判定这个名字是否为变量名• 判定这个名字是否为本函数内部的子函数• 判定这个名字是否为本目录下的私有目录内函数• 判定这个名字是否为 MATLAB 的内在函数名• 判定这个名字是否为 MATLAB 路径下的 Mex 型文件• 判定这个名字是否为 MATLAB 路径下的 M 函数

MATLAB 搜索路径的顺序是按照其路径设定文件 pathdef.m

中的先后次序来进行的。

Page 29: 第六讲  MATLAB  语言程序设计

6.7 MATLAB6.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 有关的变量和文件

Page 30: 第六讲  MATLAB  语言程序设计

6.7 MATLAB6.7 MATLAB 语言编程技巧语言编程技巧测定程序执行时间和时间分配tic 和 toc 是启动和停止秒表, cputime 获取 CPU 时间

>> tic,t=cputime;a=hilb(1000);toc,cputime-t

elapsed_time = 0.7030

ans = 0.7500

M 函数耗时剖析命令 profile

profile on

待测函数名

profile report

profile off

Page 31: 第六讲  MATLAB  语言程序设计

6.7 MATLAB6.7 MATLAB 语言编程技巧语言编程技巧

加快MALTAB 程序执行速度的建议

• 尽量避免使用循环• 多重循环情况下,外循环次数要少• 大型矩阵要预先定维• 优先考虑内在函数• 采用有效的算法• 应用 Mex 技术

Page 32: 第六讲  MATLAB  语言程序设计

6.8 6.8 例子与习题例子与习题

例一、分别用 for 和 while 循环结构编写程序,写出

并考虑一种避免循环的简洁方法来进行求和,并比较各种算法的运行时间。

例二、用循环语句形成一个有 20 个分量的数组,使其元素满足 Fibonacci 规则。

63

0

636232 2222212i

iK

Page 33: 第六讲  MATLAB  语言程序设计

6.8 6.8 例子与习题例子与习题

例三、考虑单元数组 B 的建立,判断下面的语句是否正确

例四、自己编写一个 MATLAB 函数,是它能自动生成一个 mXm 的 Hankel 矩阵,并使其调用格式为 v=[h1, h2, ….h2n-1]; H=myhankel(v);

>> B{1,1}=1;

>> B{1,2}='I Am A Student';

>> B{2,1}=180;

>> B{2,2}=[100 80 75;77 60 92;67 68 90;100 89 78];