33
第第第 第第第 MATLAB MATLAB 第第第第第第 第第第第第第 6.1 MATLAB 第第第第第第第第第第 6.2 第第 第第第第第 第第第第第第第第 、、 6.3 MATLAB 第第第第第第第 6.4 MATLAB 第第第第第第第 6.5 MATLAB 第第第第第第第第第 6.6 MATLAB 第第第第第第第 6.7 MATLAB 第第第第第第 6.8 第第第第第

第六讲 MATLAB 语言程序设计

Embed Size (px)

DESCRIPTION

第六讲 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 语言提供了两种源程序文件格式. - PowerPoint PPT Presentation

Citation preview

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];