【良心出品】MATLAB实验五《 M文件和函数句柄》
MATLABM文件与M函数

M文件与M函数Matlab输入命令的常用方式有两种:一种是直接在Matlab的命令窗门中逐条输入Matlab 命令;二是m文件工作方式。
当命令行很简单时,使用逐条输入方式还是比较方便的。
但当命令行很多时(比如说几十行乃至全成百上千行命令),显然再使用这种方式输入MATLAB 命令,就会显得杂乱无章,不易于把握程序的具体走向,并且给程序的修改和维护带来了很大的麻烦。
这时,建议采用Matlab命令的第二种输入形式m文件工作方式。
m文件工作方式,指的是将要执行的命令全部写在一个文本文件中,这样既能使程序显得简洁明了,又便于对程序的修改与维护。
m文件直接采用Matlab命令编写,就像在Matlab的命令窗口直接输入命令一样,因此调试起来也十分方便,并且增强了程序的交互性。
m文件与其他文本文件一样,可以在任何文本编辑器中进打编辑、存储、修改和读取。
利用m文件还可以根据白己的需要编写一些函数,这些函数也可以橡Matlab提供的函数一样进行调用。
从某种意义上说,这也是对MA TLAB的二次开发。
m文件有两种形式:一种是命令方式或称脚本方式;另一种就是函数文件形式。
两种形式的文件扩展名均是.m。
1、M文件当遇到输入命令较多以及要重复输入命令的情况时,利用命令文件就显得很方便了。
将所有要执行的命令按顺序放到一个扩展名为.m的文本文件中,每次运行时只需在MATLAB 的命令窗口输入m文件的文件名就可以了。
需要注意的是,m文件最好直接放在Matlab的默认搜索路径下(一般是Matlab安装目录的子目录work中),这样就不用设置m文件的路径了,否则应当用路径操作指令path重新设置路径。
另外,m文件名不应该与Matlab的内置函数名以及工具箱中的函数重名,以免发生执行错误命令的现象。
Matlab对命令文件的执行等价于从命令窗口中顺序执行文件中的所有指令。
命令文件可以访问Matlab工作空间里的任何变量及数据。
命令文件运行过程中产生的所有变量都等价于从Matlab工作空间中创建这些变量。
【良心出品】MATLAB实验五《M文件和函数句柄》

【良心出品】MATLAB实验五《M文件和函数句柄》实验五 M 文件和函数句柄一、实验目的1、掌握M 文件的编写方法。
2、熟练掌握MATLAB 的五种程序控制流结构。
3、掌握M 函数文件的一般结构。
4、了解函数句柄的创建、观察及基本使用方法。
二、实验主要仪器与设备装配有MA TLAB7.6软件的计算机三、预习要求做实验前必须认真复习第六章M 文件和函数句柄。
四、实验内容及实验步骤1、已知函数??≤<≤--<=+-x e x xx xy x 111113,编写能对任意一组输入x 值求相应y 值的程序,并验证运行结果。
(1)编写M 函数文件function y=exm060101(x)% y=exm060101(x) Function calculate of example n=length(x); for k=1:n if x(k)<-1 y(k)=x(k); elseif x(k)>=1 y(k)=exp(1-x(k)); elsey(k)=x(k)^3; endend(2)把文件exm060101.m 放置在搜索路径上(3)运行以下指令x=[-2,-1,-1.2,-0.4,0.8,1,6] y=exm060101(x) 运行结果: x =-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000y =-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.00672、已知学生的名字和百分制分数。
要求根据学生的百分制分数,分别采用“满分”、“优秀”、“良好”、“及格”、“不及格”等表示学生的学习成绩。
试用switch结构编程实现。
clear;%定义分数段:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
for k=1:10a(k)={89+k};b(k)={79+k};c(k)={69+k};d(k)={59+k};end;c=[d,c]; %输入学生的名字和分数A= cell(3,5) ;A(1,:)={'Jack','Marry','Peter','Rose','T om'};A(2,:)={72,83,56,94,100};for k=1:5switch A{2,k}case 100r='满分';case ar='优秀';case br='良好';case cr='及格';otherwiser='不及格';endA(3,k)={r};endA运行结果:A ='Jack' 'Marry' 'Peter' 'Rose' 'Tom'[ 72] [ 83] [ 56] [ 94] [ 100]'及格' '良好' '不及格' '优秀' '满分'3、试用for 循环结构创建Hilbert 矩阵。
6.M文件和函数句柄

本章内容
6.1 6.2 6.3 6.4
MATLAB控制流 脚本文件和函数文件 MATLAB的函数类别 函数句柄
MATLAB程序及其作用
从总体上说,单独的MATLAB指令,及由若干 指令构成的孤立表达式,只能解算或仿真简单 理论数学模型所描述的问题 复杂些的问题通常需要用一组理论数学算式, 这些问题的解算及仿真就需要借助较复杂的 MATLAB程序进行 这种MATLAB程序由较多的MATLAB指令和多 种多样的MATLAB表达式组成,并循着一定的 执行次序运行 这种程序的扩展名为.m,这就是脚本M文件或 函数M文件
6.2.1 M脚本文从指令窗中直接输 入指令进行计算是十分轻松简单的事 但随指令数的增加,或随控制流复杂度的增加, 或重复计算要求的提出,直接从指令窗进行计 算就显得烦琐
此时脚本文件最为适宜
“脚本”本身反映这样一个事实:MATLAB只 是按文件所写的指令执行 关于M脚本文件的编写,请参见1.8节
H1行:以%开头,后面是大写体的函数文件 名和运用关键词简要描述的函数功能,供 lookfor和help指令在线帮助使用 在线帮助文本区:包括函数输入输出宗量的 含义,调用格式说明 编写和修改记录:说明编写及修改该M文件 的作者和日期、版本记录
6.2.4 M函数文件的一般结构
函数体
由实现该M函数文件功能的MATLAB指令组 成,它接受输入量,进行程序流控制,创建 输出量
课堂练习
习题6
2
6.3 MATLAB函数类别
MATLAB的M文件分为M脚本文件和M函 数文件 函数Function又被细分为主函数、子函数、 嵌套函数、私用函数、匿名函数等 本节介绍为主函数、子函数、匿名函数
第六讲M文件和函数句柄

-4-
例 6.2.4 用 for 循环指令来求 Fibonacci 数列中第一个大于 10000 的元素 n=100;a=ones(1,n); for k=3,n a(k)=a(k-1)+a(k-2); if a(k)>=10000 a(k), break; % 跳出所在的一级循环 end; end,k ans = 10946 k= 21
6.2.4 switch-case 结构
switch ex ex 为一标量或字符串。 case test1 (commands 1) 当 ex 等于 test1 时,执行组命令 1,然后跳出该结构。 case test2 …… case testk (commands k) 当 ex 等于 testk 时,执行组命令 k,然后跳出该结构。 otherwise otherwise 指令可以不存在 (commands) 表达式不等于前面所有检测值时,则执行该组命令。 end [说明] (1)当遇到 switch 结构时,MATLAB 将表达式的值依次和各个 case 指令后面的检测值进 行比较。如果比较结果为假,则取下一个检测值再比较,一旦比较结果为真,MATLAB 将 执行相应的一组命令,然后跳出该结构。如果所有的比较结果都为假,即表达式的值和所有 的检测都不等,MATLAB 将执行 otherwise 后面的一组命令。由此可见上述结构保证了至少 有一组命令会得到执行。 (2)switch 指令后面的表达式应为一个标量或者为一个字符串。对于标量形式的表达式, 比较这样进行:表达式 = = 检测值 i。而对于字符串,MATLAB 将调用函数 strcmp 来实现 比较:strcmp(表达式,检测值 i) 。 (3)case 指令后面的检测值不仅可以为一个标量值或一个字符串,还可以为一个元胞数组。 如果一个检测值是一个元胞数组,MATLAB 将把表达式的值和该元胞数组中的所有元素进 行比较;如果元胞数组中某个元素和表达式的值相等,MATLAB 认为此次比较结果为真, 从而执行与该检测值相应的一组命令。 例 6.2.5 将百分制的学生成绩转换为五级制的成绩 x=input('请键入学生成绩:'); switch fix(x/10) case {10,9} f='A'
MATLAB m文件和函数

Matlab与系统仿真
h
22
➢ 例:
>> t=0:0.1:2*pi; >> y1=sin(t); >> y2=cos(t); >> y3=sin(t).*cos(t); >> plot(t,y1,'-',t,y2,':g',t,y3,'xk')
Matlab与系统仿真
h
23
思考:但很多实验情况下,实际上是对同一个变量进行测 量,并将数据进行绘图比较。
➢ subplot(m,n,p) :将当前窗口分割成m行、n列,并且 当前在其中的第p个区域绘图。
➢ 绘图区域编号原则:“从左到右,从上到下”。
➢ 允许每个子窗口不同的坐标系。
Matlab与系统仿真
h
26
➢ 例:
subplot(3,2,2) t=0:0.1:2*pi; y1=sin(t); plot(t,y1,'-')
Matlab与系统仿真
h
5
例1 :
>>t=0:0.1:pi; >>plot(t)
Matlab与系统仿真
h
6
例2 :绘制出一个周期内的正弦曲线
*语句命令及绘图结果:
>>t=0:0.1:2*pi; >>y=sin(t); >>plot(t,y)
Matlab与系统仿真
h
7
例3 :
>> t=0:0.1:2*pi; >> y1=sin(t); >> y2=cos(t); >> y3=sin(t).*cos(t); >> plot(t,y1,'-')
第6章 M文件和函

©通信与电子工程学院
MATLAB语言 电子教案
(2)在指令窗中运行 [S,L]=exm060201(6,2,'-g') S= 1 10.3923 L= 0.5 12.0000
改变输入输出参数 观察运行结果
0
-0.5
-1 -1
-0.5
0
0.5
1
©通信与电子工程学院
MATLAB语言 电子教案
6.3 MATLAB的函数类别
MATLAB语言 电子教案
2 、 while 语句的一般格式 while (条件)
commands (循环体语句) end 其执行过程为:若条件成立,则执行循 环 体语句,执行后再判断条件是否成立, 如 果不成立则跳出循环
©通信与电子工程学院
MATLAB语言 电子教案
a(1)=1; a(2)=1; i=2; while a(i)<=10000 a(i+1)=a(i-1)+a(i); i=i+1; end; i,a(i)
error('输入宗量只能取 ''line'' 或 ''circle'' ! ')
end shg
©通信与电子工程学院
MATLAB语言 电子教案
3.匿名函数(Anonymous function)
4.函数句柄 函数句柄(Function handle)是MATLAB 的一种数据类型。它使“函数调用”象“变量 调用”一样灵活方便;提高函数调用速度。
【例6.2-1】编写一个M函数文件。 它具有以下功能: (A)根据指定的半径,画出蓝色圆周线; (B)可以通过输入字符串,改变圆周线的颜色、线 型; (C)假若需要输出圆面积,则绘出圆。
第六章 M文件和函数句柄

例7.4-2 assignin 运作机理示范 function y=xyq(x) y=sqrt(x);t=x^2; assignin('base','yy',t)
将当前工作空间变量t的 值跨空间赋给变量yy 运行结果: 运行结果 x y yy 4 2 16
H1行,lookfor和help查询用 • 脚本文件包括两部分:注释部分和程序部分 文件包括两部分: %RANK Number of linearly independent rows or columns. % K = RANK(X) is the number of singular values of X % that are larger than MAX(SIZE(X)) * NORM(X) * EPS. % K = RANK(X,tol) is the number of singular values of X that % are larger than tol. help文本区 % Copyright (c) 1984-94 by The MathWorks, Inc. 全局变量 global abc; 局部变量 s = svd(x); if (nargin == 1) tol = max(size(x)) * max(s) * eps; end r = sum(s > tol);
y(1,k)=eval([CEM{k},'(',num2str(theta),')']); disp([CEM{k},'(',num2str(theta),')',… blanks(6),num2str(y(1,k))]); end
MATLAB函数句柄和M文件

MATLAB函数句柄和M文件第 6 章M 文件和函数句柄6.1 Matlab控制流6.2 脚本文件和函数文件6.3 Matlab的函数类别6.4 函数句柄6.1 MATLAB 控制流6.1.1 if-else-end 条件控制6.1.2 swith-case 控制语句6.1.3 for 循环和while 循环6.1.4 控制程序流和的其他常用指令6.1.1 if-else-end 条件控制0.1x 2例 6.1-1 】已知y e sin x 0.5(x 0.1) sin x ,在50 x 5 区间,求函数的最小值。
回顾与复习 :[x,fval,exitflag,output]=fminbnd(fun,x1,x2,options) 求一元函数在区间 (x1, x2)中极小值在第四章中采用的方法( 1)采用优化算法求极小值 x1=-50;x2=5; % yx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); [xc0,fc0,exitflag,output]=fminbnd(yx,x1,x2)<9>%( 2)据图形观察,重设 fminbnd 的搜索区间 xx=[-23,-20,-18];%fc=fc0;xc=xc0; % for k=1:2[xw,fw]=fminbnd(yx,xx(k),xx(k+1)); <16> if fw<fc xc=xw; fc=fw; end endfprintf(' 函数最小值 %6.5f 发生在 x=%6.5f 处 ',fc,xc) 函数最小值 -3.34765 发生在 x=-19.60721 处1)function [xmin,fmin,n]=exm060101(fx,a,b,Nt) % exm060101.m2sin(x) /exp(x/10) - (sin(x) (x + 1/10))/2-50-45 -40 -35 -30 -25-20 -15 -10 -5x70 6050 40 30 2010[~,f0]=fminbnd(fx,a,b); % n=1; jj=1;%% while 1n=2*n; %d=(b-a)/n;% x=a:d:b;%ii=0;xc=zeros(1,n);fc=xc; %for k=1:n %[w,f,eflag]=fminbnd(fx,x(k),x(k+1)); % if eflag>0 % ii=ii+1; xc(ii)=w; fc(ii)=f; end end[fmin,kk]=min(fc); % xmin=xc(kk); % if abs(f0-fmin)<1e-6 % jj=jj+1; % if jj>Nt %break % endelseif f0-fmin>1e-6 % f0=fmin; % jj=1; %end end 2) clear fx=@(x)(sin(x)^2*exp(-0.1*x)-0.5*sin(x)*(x+0.1)); a=-50;b=5; [xmin,fmin,n]=exm060101(fx,a,b,3);fprintf(' 在x=%6.5f 处,函数到达最小 值 %6.5f\n',xmin,fmin)fprintf(' 最终子区间分割数为 %d\n',n)在 x=-19.60721 处,函数到达最小值 -3.34765 最终子区间分割数为 1286.1.2 switch-case 控制结构% fx % a 、 b % Nt % xmin【例 6.1-2】已知学生姓名和百分制分数,用“满分” ,优秀、良好、及格和不及格表示学生成绩clear;%for k=1:10a(k)={89+k};b(k)={79+k};c(k)={69+k};d(k)={59+k};end;c=[d,c];%A=cell(3,5); %A(1,:)={'Jack','Marry','Peter','Rose','Tom'表 6.1-3 循环结构的使用方式【例 6.1-3 】请分别写出用 for 和 while 循环语句计算 1000000K 0.2i 1 0.2 0.22 0.21000000的程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 M 文件和函数句柄
一、实验目的
1、掌握M 文件的编写方法。
2、熟练掌握MATLAB 的五种程序控制流结构。
3、掌握M 函数文件的一般结构。
4、了解函数句柄的创建、观察及基本使用方法。
二、实验主要仪器与设备
装配有MA TLAB7.6软件的计算机
三、预习要求
做实验前必须认真复习第六章M 文件和函数句柄。
四、实验内容及实验步骤
1、已知函数⎪⎩
⎪⎨⎧≤<≤--<=+-x e x x
x x
y x 11111
3
,编写能对任意一组输入x 值求相应y 值的程序,
并验证运行结果。
(1)编写M 函数文件 function y=exm060101(x)
% y=exm060101(x) Function calculate of example n=length(x); for k=1:n if x(k)<-1 y(k)=x(k); elseif x(k)>=1 y(k)=exp(1-x(k)); else
y(k)=x(k)^3; end
end
(2)把文件exm060101.m 放置在搜索路径上 (3)运行以下指令
x=[-2,-1,-1.2,-0.4,0.8,1,6] y=exm060101(x) 运行结果: x =
-2.0000 -1.2000 -0.4000 0.8000 1.0000 6.0000
y =
-2.0000 -1.2000 -0.0640 0.5120 1.0000 0.0067
2、已知学生的名字和百分制分数。
要求根据学生的百分制分数,分别采用“满分”、“优秀”、“良好”、“及格”、“不及格”等表示学生的学习成绩。
试用switch结构编程实现。
clear;
%定义分数段:满分(100),优秀(90-99),良好(80-89),及格(60-79),不及格(<60)。
for k=1:10
a(k)={89+k};b(k)={79+k};c(k)={69+k};d(k)={59+k};
end;
c=[d,c]; %输入学生的名字和分数
A= cell(3,5) ;
A(1,:)={'Jack','Marry','Peter','Rose','Tom'};
A(2,:)={72,83,56,94,100};
for k=1:5
switch A{2,k}
case 100
r='满分';
case a
r='优秀';
case b
r='良好';
case c
r='及格';
otherwise
r='不及格';
end
A(3,k)={r};
end
A
运行结果:
A =
'Jack' 'Marry' 'Peter' 'Rose' 'Tom'
[ 72] [ 83] [ 56] [ 94] [ 100]
'及格' '良好' '不及格' '优秀' '满分'
3、试用for 循环结构创建Hilbert 矩阵。
K=5;
A = zeros(k,k); for m = 1:K
for n = 1:K
A(m,n)=1/(m+n-1) ;
end end format rat A
format short g 运行结果: A =
1 1/
2 1/
3 1/
4 1/
5 1/2 1/3 1/4 1/5 1/
6 1/3 1/4 1/5 1/6 1/
7 1/4 1/5 1/6 1/7 1/
8 1/5 1/6 1/7 1/8 1/9
4、编写计算∑∑===N
n n k k S 111,其中⎪⎪⎭
⎪
⎪⎬⎫
≤⎪⎪⎩⎪⎪⎨⎧=∑=ε
N k k N 1
1
min arg ,ε是预先 给定的控制精度。
使用while 循环结构编程实现。
(1)编写M 函数文件exm060104(x)
function [S,N]=exm060104(epsilon) k=0; s=0; d=inf; S=0;
while d>epsilon
k=k+1;
s=s+k; d=1/s;
S=S+d;
end N=k;
(2)把文件exm060104.m保存在处于MATLAB搜索路径的文件夹中。
(3)运行以下指令(控制精度假设取0.0001)
[S,N]=exm060104(0.0001)
运行结果:
S =
1.9859
N =
141
五、实验报告与思考题
说明M函数文件的一般结构。
(1)函数申明行(function declaration line):位于函数文件的首行;以MATLAB
关键字function开头;函数名以及函数的输入/输出量名都在这一行被定义.
(2)H1行(the first help text line):紧随函数申明行之后以%开头的第一注释行;
按MA TLAB自身文件的规则,H1行包含大写体的函数文件名和运用关键词
简要描述的函数功能。
该H1行提供lookfor关键词查询和help在线帮助使用。
(3) 在线帮助文本(help text)区:H1行及其之后的连续的一%开头的所有注释
行构成整个在线帮助文本。
它通常包括:函数输入/输出宗量的含义;调用
格式说明。
(4) 编写和修改记录:起几何位置与在线帮助文本区相隔一个空行(不用%符开
头)。
该区域文本内容也都以%开头;标志编写及修改改M文件的作者和日
期、版本记录。
它用作软件档案管理。
(5) 函数体(function body):为清晰起见,与前面的注释一空行相隔。
这部分
内容由实现该M函数文件功能的MA TLAB指令组成。
它接受输入量,进行
程序流控制,创建输出量。
其中为阅读、理解方便,也配置适当的空行和注释。
(6)若仅从运算角度看,唯“函数申明行”和“函数体”两部分是构成M函数文件
所必不可少的。