n6ch07.docx
- 文档编号:4347584
- 上传时间:2022-11-30
- 格式:DOCX
- 页数:14
- 大小:35.50KB
n6ch07.docx
《n6ch07.docx》由会员分享,可在线阅读,更多相关《n6ch07.docx(14页珍藏版)》请在冰豆网上搜索。
n6ch07
第七章M文件和函数句柄
.1M文本编辑器
.2MATLAB控制流
.2.1for循环结构
【例7.2-1】一个简单的for循环示例。
forii=1:
10;
x(ii)=ii;
end;
x
x=
12345678910
.2.2while循环结构
【例7.2-2】Fibonacci数组的元素满足Fibonacci规则:
,
;且
。
现要求该数组中第一个大于10000的元素。
a
(1)=1;a
(2)=1;i=2;
whilea(i)<=10000
a(i+1)=a(i-1)+a(i);
i=i+1;
end;
i,a(i),
i=
21
ans=
10946
.2.3if-else-end分支结构
【例7.2-3】一个简单的分支结构。
cost=10;number=12;
ifnumber>8
sums=number*0.95*cost;
end,sums
sums=
114.0000
【例7.2-4】用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。
n=100;a=ones(1,n);
fori=3:
n
a(i)=a(i-1)+a(i-2);
ifa(i)>=10000
a(i),
break;
end;
end,i
ans=
10946
i=
21
.2.4switch-case结构
【例7.2-5】学生的成绩管理,用来演示switch结构的应用。
clear;
fori=1:
10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];
Name={'Jack','Marry','Peter','Rose','Tom'};
Mark={72,83,56,94,100};Rank=cell(1,5);
S=struct('Name',Name,'Marks',Mark,'Rank',Rank);
fori=1:
5
switchS(i).Marks
case100
S(i).Rank='满分';
casea
S(i).Rank='优秀';
caseb
S(i).Rank='良好';
casec
S(i).Rank='及格';
otherwise
S(i).Rank='不及格';
end
end
disp(['学生姓名','得分','等级']);disp('')
fori=1:
5;
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);
end;
学生姓名得分等级
Jack72及格
Marry83良好
Peter56不及格
Rose94优秀
Tom100满分
.2.5try-catch结构
【例7.2-6】try-catch结构应用实例。
clear,N=4;A=magic(3);
try
A_N=A(N,:
),
catch
A_end=A(end,:
),
end
lasterr
A_end=
492
ans=
Indexexceedsmatrixdimensions.
.2.6控制程序流的其它常用指令
.3脚本文件和函数文件
.3.1M脚本文件
.3.2M函数文件
.3.3局部变量和全局变量
.3.4M文件的一般结构
【例7.3-1】M函数文件示例。
[circle.m]
functionsa=circle(r,s)
%CIRCLEplotacircleofradiirinthelinespecifiedbys.
%r指定半径的数值
%s指定线色的字符串
%sa圆面积
%
%circle(r)利用蓝实线画半径为r的圆周线.
%circle(r,s)利用串s指定的线色画半径为r的圆周线.
%sa=circle(r)计算圆面积,并画半径为r的蓝色圆面.
%sa=circle(r,s)计算圆面积,并画半径为r的s色圆面.
%编写于1999年4月7日,修改于1999年8月27日。
ifnargin>2
error('输入宗量太多。
');
end;
ifnargin==1
s='b';
end;
clf;
t=0:
pi/100:
2*pi;
x=r*exp(i*t);
ifnargout==0
plot(x,s);
else
sa=pi*r*r;
fill(real(x),imag(x),s)
end
axis('square')
.3.5P码文件
10一语法分析过程和伪代码
10二P码文件的预生成
10三内存中P码文件的列表和清除
.3.6MATLAB的搜索过程
.4变量的检测传递和限权使用函数
.4.1输入输出宗量检测指令
.4.2跨空间变量传递
10一跨空间计算串表达式的值
【例7.4-1】evalin运行机理与eval的异同。
(1)编写M函数文件
[evalinzzy.m]
functiony1=evalinzzy(a,s)
t=(0:
a)/a*2*pi;
y1=subevalinzzy(4,s);
%------------subfunction-------------
functiony2=subevalinzzy(a,s)
t=(0:
a)/a*2*pi;ss='a*exp(i*t)';
switchs
case{'base','caller'}
y2=evalin(s,ss);
case'self'
y2=eval(ss);
end
(2)在Notebook或MATLAB指令窗中运行以下指令
clear,a=30;t=(0:
a)/a*2*pi;sss={'base','caller','self'};
fork=1:
3
y0=evalinzzy(8,sss{k});
subplot(1,3,k)
plot(real(y0),imag(y0),'r','LineWidth',3),axissquareimage
end
图7.4-1利用不同工作空间中的变量值计算eval('a*exp(i*t)')
10二跨空间赋值
【例7.4-2】assignin运作机理示范。
(1)编写M函数文件
[assigninxyq.m]
functiony=assigninxyq(x)
y=sqrt(x);t=x^2;
assignin('base','yy',t)
(2)在Notebbok或MATLAB指令窗中运行以下指令
clear;x=4;y=assigninxyq(x);
disp([blanks(5),'x',blanks(5),'y',blanks(4),'yy']),disp([x,y,yy])
xyyy
4216
.4.3子函数和私用函数
10一子函数
10二私用函数
.5串演算函数
.5.1eval
【例7.5-1】计算“语句”串,创建变量。
clear,t=pi;eval('theta=t/2,y=sin(theta)');
theta=
1.5708
y=
1
【例7.5-2】计算“合成”串。
CEM={'cos','sin','tan'};
fork=1:
3
theta=pi*k/12;
y(1,k)=eval([CEM{k},'(',num2str(theta),')']);
end
y
y=
0.96590.50001.0000
.5.2feval
【例7.5-3】对字符串类型函数只能用eval,而不能用feval。
x=pi/4;Ve=eval('1+sin(x)')
Ve=
1.7071
Vf=feval('1+sin(x)',x)
?
?
?
Errorusing==>feval
Invalidfunctionname'1+sin(x)'.
【例7.5-4】函数句柄只能被feval运用,而不能被eval调用。
(1)
rand('seed',1);A=rand(2,2);
Heig=@eig;
d=feval(Heig,A)
d=
0.7568
-0.1488
(2)
de=eval(Heig,A)
?
?
?
Errorusing==>eval
Function'eval'notdefinedforvariablesofclass'function_handle'.
(3)
dn=feval('eig',A)
dn=
0.7568
-0.1488
.5.3内联函数
【例7.5-5】用内联函数对象实现
。
G=inline('a*exp(x)*cos(y)','a','x','y');
disp([class(G),blanks(10),char(G)])
argnames(G)
inlinea*exp(x)*cos(y)
ans=
'a'
'x'
'y'
GG=vectorize(G)
GG=
Inlinefunction:
GG(a,x,y)=a.*exp(x).*cos(y)
GG(2,[1,2],[pi/3,pi])
ans=
2.7183-14.7781
【例7.5-6】演示:
最简练格式创建内联函数;内联函数可被feval指令调用。
Z2=inline('P1*x*sin(x^2+P2)',2)
Z2=
Inlinefunction:
Z2(x,P1,P2)=P1*x*sin(x^2+P2)
z2=Z2(2,2,3)
fz2=feval(Z2,2,2,3)
z2=
2.6279
fz2=
2.6279
.6函数句柄
.6.1函数句柄的创建和观察
【例7.6-1】为MATLAB的“内建”函数创建函数句柄,并观察其内涵。
(1)
hsin=@sin;
(2)
class(hsin)
size(hsin)
ans=
function_handle
ans=
11
(3)
CC=functions(hsin)
CC=
function:
'sin'
type:
'overloaded'
file:
'MATLABbuilt-infunction'
methods:
[1x1struct]
(4)
CC.methods
ans=
sym:
'd:
\matlabr12\toolbox\symbolic\@sym\sin'
.6.2函数句柄的基本用法
【例7.6-2】本例通过sin函数及其句柄演示若干基本用法。
(1)
fhandle=str2func('sin');
(2)
ys=sin(pi/4)
yfold=feval('sin',pi/4)
yfnew=feval(fhandle,pi/4)
ys=
0.7071
yfold=
0.7071
yfnew=
0.7071
(3)
Alpha=sym('pi/4');
yss=sin(Alpha)
yfold=feval('sin',Alpha)
ynews=feval(fhandle,Alpha)
yss=
1/2*2^(1/2)
yfold=
1/2*2^(1/2)
ynews=
1/2*2^(1/2)
(4)
xold=fminbnd('sin',0,2*pi)
xnew=fminbnd(fhandle,0,2*pi)
xold=
4.7124
xnew=
4.7124
【例7.6-3】自建函数及其句柄的使用。
通过本例可看到:
只要在当前MATLAB工作空间中存在函数句柄,那末不管该函数当前是否在搜索范围内,均可通过函数句柄实现正确的运作。
(1)
[zzy076_3.m]
functionHr=zzy076_3(flag)
%ZZY076_3为演示函数、子函数句柄而设计的绘图文件。
%flag可以取字符串'line'或'circle'。
t=(0:
100)/100*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;%创建子函数的句柄
feval(Hr,flag,x,y,t)
%-------------subfunction---------------------------
functioncirline(wd,x,y,t)
%wd接受字符串'line'或'circle'
%t画线用的独立参变量
%x由t产生的横坐标变量
%y由t产生的纵坐标变量
switchwd
case'line'
plot(t,x,'b',t,y,'r','LineWidth',2)
case'circle'
plot(x,y,'g.','MarkerSize',30),
axissquareoff
otherwise
error('输入宗量只能取''line''或''circle''!
')
end
shg
(2)
Hzzy076_3=@zzy076_3
zzy076_3('line');
Hzzy076_3=
@zzy076_3
图7.6_1exm076_3.m绘制的曲线
(3)
which('zzy076_3')
zzy076_3notfound.
(4)
zzy076_3('line')
feval('zzy076_3','line')
?
?
?
Undefinedfunctionorvariable'zzy076_3'.
(6)
feval(Hzzy076_3,'line');
【例7.6-4】子函数句柄的创建与使用。
本例仍然使用上例中的zzy076_3.m文件。
通过本例可以看到:
原先只能在“父函数”视野(Scope)内被调用的子函数,借助其句柄,可扩大使用范围。
即,只要MATLAB工作空间中有子函数的句柄,它就能被正确调用,不管该子函数是否在当前视野内,也不管该子函数的父函数是否在搜索路径上。
(1)
HCL=zzy076_3('circle')
HCL=
@cirline
图7.6_2zzy076_3.m绘制的圆
(2)
tt=(0:
100)/100*2*pi;
xx=sin(tt);
yy=cos(tt);
cirline('circle',xx,yy,tt);
feval('circle',xx,yy,tt)
?
?
?
Undefinedfunctionorvariable'cirline'.
(3)
feval(HCL,'circle',xx,yy,tt)
习题7
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- n6ch07