第六讲 第六讲 MATLAB 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 6.1 MATLAB 语言函数的基本结语言函数的基本结构构MATLAB 语言提供了两种源程序文件格式
• M 脚本文件:它实际上是 MATLAB 命令窗中一系列命令的组合,它没有输入输出参数传递的过程,它直接对工作区中的变量进行处理操作
• M 函数:这是 MATLAB 程序设计的主流,它可以传递参数及返回结果,我们主要介绍 M 函数的编写方法与技巧。
6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构
M 函数是由 function 语句引导的,其基本格式如下
function [返回变量列表]=函数名(输入变量列表)%由该符号引导的注释语句段,在 MATLAB 命令窗%中用命令 help 函数名 所得到的帮助就是这段文字。输入、返回变量格式的检测函数体语句
只要进入该函数, MATLAB 就自动生成 nargin 和 nargout
两个变量,分别表示输入变量和输出变量的个数。程序中可以根据这两个变量的值来判断用户输入参数的情况。
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
6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构
说明
• 注释符号%引导的内容不能含空行,否则,后续的内容不能由 help 命令看到,大部分作者及版权信息都是空行后的注释内容。
• 当返回变量只有一个时,不用方框号[]括起来。
• 函数名与该函数存盘用的文件名要一样,否则 MATLAB
寻找的是文件名符合的函数,而且老版本的 MATLAB 不能用超过 8 个字符的函数名。
6.1 MATLAB 6.1 MATLAB 语言函数的基本结语言函数的基本结构构
说明(续)
• 可以用 type 函数名 来看函数文件的内容。
• 可以用 edit 函数名 来查看或编辑函数文件。
• 为了使得 MATLAB 认识该函数,要将该函数所在的目录用 cd 命令设为当前目录,或用命令 addpath 添加到 MAT
LAB 的路径中去(也可以用 MATLAB 菜单下的 PATH 命令)。
6.2 6.2 全局、局部变量、子函数与私有目全局、局部变量、子函数与私有目录录
• MATLAB 工作区中的变量和 M 函数内部的变量都是局部变量,他们是互不干扰的,但也可以显性地把变量定义为全局变量,使得他们在整个程序中都起作用。
• 全局变量定义格式为 global a b c d
注意变量之间不能用逗号分开,在 MATLAB 工作区和 M
函数内部同时要声明该变量为全局变量。
• 为保证函数的独立性,一般情况下不建议使用全局变量。
6.2 6.2 全局、局部变量、子函数与私有目全局、局部变量、子函数与私有目录录
• 从 MATLAB 5.0 开始引入子函数。所谓子函数就是一个函数文件中不但包含该函数本身,还包含专门由该函数调用的下一级函数,这样的专门函数称为子函数。子函数是不能有其他文件中的函数调用的。
• 私有目录即在当前的 MATLAB 目录下建立一个 private
子目录,该目录下的内容只能由当前目录下的函数调用,而不能有其他函数调用。
6.3 MATLAB6.3 MATLAB 函数的跟踪调试函数的跟踪调试
• 用 MATLAB 自带的编辑器 EDIT 编辑所要跟踪调试的程序,在希望的语句上设置断点,在 MATLAB 命令窗按正常方式运行命令,程序会自动停留在所设的断点处。
• 调试状态下, MATLAB 命令窗的命令提示符变为 K>> 。这时可输入任何MATLAB 命令,变量为函数内部的局部变量,而不是工作区中的变量。
• 调试状态下,鼠标指针指向想查询的局部变量上将立即能显示出该变量值。
6.3 MATLAB6.3 MATLAB 函数的跟踪调试函数的跟踪调试
• 跟踪调试程序中 Debug 菜单下的子菜单项的功能如下表
菜单项 执行结果Set/Clear Breakpoint
设置或清除断点
Continue 继续执行到下一个断点Step 单步执行Step in 单步,若该步调用函数,则在该
函数中也单步执行Exit Debug Mode 退出调试状态
6.4 MATLAB6.4 MATLAB 工具箱编写技巧工具箱编写技巧• 将为某种专门目的编写一组 MATLAB 函数放在一个目录
下,就形成了一个新的工具箱。• 为了使得用户能象MATLAB 提供的工具箱一样使用该工
具箱,必须将该工具箱所在的目录用命令 addpath 添加到MATLAB 的搜索路径中去。
• 为了能使得命令 help 工具箱名 能列出该工具箱的所有函数的功能介绍,应该按下述格式编写一个名为 contents.m
的文件。第一行给出工具箱名称,第二行给出版本信息,由命令 ver 工具箱名 可以获得该工具箱的版本信息。
• 一般在该工具箱下还有一文件 readme.m 用来存放有关该工具箱的版本升级信息,使用命令 whatsnew 工具箱名 查看的就是该文件的信息。
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.
6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句
MATLAB 提供了循环语句结构、条件语句结构、开关语句结构以及试探语句。
for 循环变量 = s1:s2:s3
循环体语句组end
循环语句结构
for 循环变量 = Vector
循环体语句组end
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
6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句条件语句结构
if 条件式 1
条件块语句组 1
else
条件块语句组 2
end
if 条件式 1
条件块语句组 1
elseif 条件式 2
条件块语句组 2
……
else
条件块语句组 n+1
end
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
6.5 MATLAB6.5 MATLAB 语言的程序流程语句语言的程序流程语句开关结构
switch 开关表达式case 表达式 1
语句段 1
case {表达式 2 ,表达式 3 ,…,表达式 m} 语句段 2
……
otherwise
语句段 n
end
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]
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
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
6.6 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构类 class
类不但包含成员变量,还包含成员函数,我们通过一个例子来介绍类的构造,下面建立多项式类。
1. 首先选定一个类的名字,如多项式类我们选为 polynom 。2. 以这个名字在当前目录下建立一个子目录,而且要加符号
@ ,即建立子目录 @polynom 。该目录无需在 MATLAB
路径下再指定。
6.6 MATLAB6.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 MATLAB6.6 MATLAB 中新的数据结构中新的数据结构
polynom类的构造函数 polynom.m
>> p = polynom([1 0 -2 -5])
p = polynom object: 1-by-1
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
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
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
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
6.7 MATLAB6.7 MATLAB 语言编程技巧语言编程技巧MATLAB运行机制MATLAB 语言在函数调用中或文件执行时,如果遇到了某一个名字,则按照下面的优先级顺序对这个名字进行判定。• 判定这个名字是否为变量名• 判定这个名字是否为本函数内部的子函数• 判定这个名字是否为本目录下的私有目录内函数• 判定这个名字是否为 MATLAB 的内在函数名• 判定这个名字是否为 MATLAB 路径下的 Mex 型文件• 判定这个名字是否为 MATLAB 路径下的 M 函数
MATLAB 搜索路径的顺序是按照其路径设定文件 pathdef.m
中的先后次序来进行的。
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 有关的变量和文件
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
6.7 MATLAB6.7 MATLAB 语言编程技巧语言编程技巧
加快MALTAB 程序执行速度的建议
• 尽量避免使用循环• 多重循环情况下,外循环次数要少• 大型矩阵要预先定维• 优先考虑内在函数• 采用有效的算法• 应用 Mex 技术
6.8 6.8 例子与习题例子与习题
例一、分别用 for 和 while 循环结构编写程序,写出
并考虑一种避免循环的简洁方法来进行求和,并比较各种算法的运行时间。
例二、用循环语句形成一个有 20 个分量的数组,使其元素满足 Fibonacci 规则。
63
0
636232 2222212i
iK
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];
Recommended