n6ch07Word文档下载推荐.docx
《n6ch07Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《n6ch07Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
n=100;
a=ones(1,n);
fori=3:
n
a(i)=a(i-1)+a(i-2);
ifa(i)>
a(i),
break;
end;
end,i
10946
21
.2.4switch-case结构
【例7.2-5】学生的成绩管理,用来演示switch结构的应用。
clear;
fori=1:
a{i}=89+i;
b{i}=79+i;
c{i}=69+i;
d{i}=59+i;
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);
5
switchS(i).Marks
case100
S(i).Rank='
满分'
;
casea
优秀'
caseb
良好'
casec
及格'
otherwise
不及格'
end
end
disp(['
学生姓名'
得分'
等级'
]);
disp('
'
)
5;
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);
学生姓名得分等级
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,:
),
lasterr
A_end=
492
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('
输入宗量太多。
'
);
ifnargin==1
s='
b'
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)
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)
ss='
a*exp(i*t)'
switchs
case{'
base'
caller'
}
y2=evalin(s,ss);
case'
self'
y2=eval(ss);
(2)在Notebook或MATLAB指令窗中运行以下指令
clear,a=30;
sss={'
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('
10二跨空间赋值
【例7.4-2】assignin运作机理示范。
[assigninxyq.m]
functiony=assigninxyq(x)
y=sqrt(x);
t=x^2;
assignin('
yy'
t)
(2)在Notebbok或MATLAB指令窗中运行以下指令
x=4;
y=assigninxyq(x);
disp([blanks(5),'
x'
blanks(5),'
y'
blanks(4),'
]),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'
theta=pi*k/12;
y(1,k)=eval([CEM{k},'
('
num2str(theta),'
)'
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('
x)
?
Errorusing==>
feval
Invalidfunctionname'
.
【例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)
eval
Function'
eval'
notdefinedforvariablesofclass'
function_handle'
(3)
dn=feval('
eig'
A)
dn=
.5.3内联函数
【例7.5-5】用内联函数对象实现
G=inline('
a*exp(x)*cos(y)'
a'
disp([class(G),blanks(10),char(G)])
argnames(G)
inlinea*exp(x)*cos(y)
ans=
GG=vectorize(G)
GG=
Inlinefunction:
GG(a,x,y)=a.*exp(x).*cos(y)
GG(2,[1,2],[pi/3,pi])
2.7183-14.7781
【例7.5-6】演示:
最简练格式创建内联函数;
内联函数可被feval指令调用。
Z2=inline('
P1*x*sin(x^2+P2)'
2)
Z2=
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的“内建”函数创建函数句柄,并观察其内涵。
hsin=@sin;
class(hsin)
size(hsin)
function_handle
11
CC=functions(hsin)
CC=
function:
type:
overloaded'
file:
MATLABbuilt-infunction'
methods:
[1x1struct]
(4)
CC.methods
sym:
d:
\matlabr12\toolbox\symbolic\@sym\sin'
.6.2函数句柄的基本用法
【例7.6-2】本例通过sin函数及其句柄演示若干基本用法。
fhandle=str2func('
ys=sin(pi/4)
yfold=feval('
pi/4)
yfnew=feval(fhandle,pi/4)
ys=
0.7071
yfold=
yfnew=
0.7071
Alpha=sym('
pi/4'
yss=sin(Alpha)
Alpha)
ynews=feval(fhandle,Alpha)
yss=
1/2*2^(1/2)
ynews=
1/2*2^(1/2)
xold=fminbnd('
0,2*pi)
xnew=fminbnd(fhandle,0,2*pi)
xold=
4.7124
xnew=
4.7124
【例7.6-3】自建函数及其句柄的使用。
通过本例可看到:
只要在当前MATLAB工作空间中存在函数句柄,那末不管该函数当前是否在搜索范围内,均可通过函数句柄实现正确的运作。
[zzy076_3.m]
functionHr=zzy076_3(flag)
%ZZY076_3为演示函数、子函数句柄而设计的绘图文件。
%flag可以取字符串'
line'
或'
circle'
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接受字符串'
或'
%t画线用的独立参变量
%x由t产生的横坐标变量
%y由t产生的纵坐标变量
switchwd
plot(t,x,'
t,y,'
2)
plot(x,y,'
g.'
MarkerSize'
30),
axissquareoff
otherwise
输入宗量只能取'
或'
!
shg
Hzzy076_3=@zzy076_3
zzy076_3('
Hzzy076_3=
@zzy076_3
图7.6_1exm076_3.m绘制的曲线
which('
zzy076_3'
)
zzy076_3notfound.
feval('
Undefinedfunctionorvariable'
(6)
feval(Hzzy076_3,'
【例7.6-4】子函数句柄的创建与使用。
本例仍然使用上例中的zzy076_3.m文件。
通过本例可以看到:
原先只能在“父函数”视野(Scope)内被调用的子函数,借助其句柄,可扩大使用范围。
即,只要MATLAB工作空间中有子函数的句柄,它就能被正确调用,不管该子函数是否在当前视野内,也不管该子函数的父函数是否在搜索路径上。
HCL=zzy076_3('
HCL=
@cirline
图7.6_2zzy076_3.m绘制的圆
tt=(0:
xx=sin(tt);
yy=cos(tt);
cirline('
xx,yy,tt);
xx,yy,tt)
cirline'
feval(HCL,'
习题7