ch07第七章M文件和面向对象编程Word格式文档下载.docx
《ch07第七章M文件和面向对象编程Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《ch07第七章M文件和面向对象编程Word格式文档下载.docx(35页珍藏版)》请在冰豆网上搜索。
![ch07第七章M文件和面向对象编程Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-11/26/b9ccb6f8-de02-4c5b-a470-e4c8c9e84feb/b9ccb6f8-de02-4c5b-a470-e4c8c9e84feb1.gif)
x=
12345678910
7.3.2while循环结构
【例7.3.2-1】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;
i,a(i),
i=
21
ans=
10946
7.3.3if-else-end分支结构
【例7.3.3-1】一个简单的分支结构。
cost=10;
number=12;
ifnumber>
8
sums=number*0.95*cost;
end,sums
sums=
114.0000
【例7.3.3-2】用for循环指令来寻求Fibonacc数组中第一个大于10000的元素。
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
7.3.4switch-case结构
【例7.3.4-1】学生的成绩管理,用来演示switch结构的应用。
clear;
%
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
不及格'
disp(['
学生姓名'
得分'
等级'
]);
disp('
'
)
5;
disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i).Rank]);
学生姓名得分等级
Jack72及格
Marry83良好
Peter56不及格
Rose94优秀
Tom100满分
7.3.5try-catch结构
【例7.3.5-1】try-catch结构应用实例:
对
魔方阵的行进行援引,当“行下标”超出魔方阵的最大行数时,将改向对最后一行的援引,并显示“出错”警告。
clear,N=4;
A=magic(3);
try
A_N=A(N,:
catch
A_end=A(end,:
lasterr
A_end=
492
Indexexceedsmatrixdimensions.
7.3.6控制程序流的其它常用指令
7.3.6.1return指令
7.3.6.2input和keyboard指令
7.3.6.3yesinput指令
7.3.6.4pause指令
7.3.6.5break指令
7.3.6.6error和warning指令
7.4脚本文件和函数文件
7.4.1M脚本文件
7.4.2M函数文件
7.4.3局部变量和全局变量
7.4.4M文件的一般结构
【例7.4.4-1】M函数文件示例。
本例演示:
(A)编写一个画任意半径任意色彩线型的圆。
(B)完整函数文件的基本结构。
(C)函数文件各基本组成部分的作用。
[exm07044_1.m]
functionsa=exm07044_1(r,s)
%CIRCLE
%
ifnargin>
2
error('
输入宗量太多。
'
);
ifnargin==1
s='
b'
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'
7.4.5P码文件
7.4.5.1语法分析过程和伪代码
7.4.5.2P码文件的预生成
7.4.5.3内存中P码文件的列表和清除
7.4.6MATLAB的搜索过程
7.5变量的检测传递和限权使用函数
7.5.1输入输出宗量检测指令
7.5.2“变长度”输入输出宗量
【例7.5.2-1】变长度宗量使用示例。
(1)
[exm07052_1.m]
functionvarargout=exm07052_1(r,varargin)
%RINGZYPlotaringandcalculatetheareaofthering.
vin=length(varargin);
Nin=vin+1;
%<
11>
error(nargchk(1,Nin,nargin))%
ifnargout>
6%
Toomanyoutputarguments'
pi/20:
s=pi*r*r;
switchNin
case1
plot(x,'
case2
r2=varargin{1};
%<
22>
x2=r2*exp(i*t);
holdon;
plot(x2,'
holdoff
otherwise
26>
plot(x,varargin{2:
end});
holdon%<
28>
plot(x2,varargin{2:
holdoff%<
29>
axis('
varargout{1}=real(x);
varargout{2}=imag(x);
%<
33>
varargout{5}=pi*r*r;
varargout{6}=[];
%<
34>
ifNin>
36>
varargout{3}=real(x2);
varargout{4}=imag(x2);
%<
38>
varargout{6}=pi*(r^2-r2^2);
%<
39>
end
r1=1;
r2=3;
[x1,y1,x2,y2,s1,s2]=exm07052_1(r1);
[x1,y1,x2,y2]=exm07052_1(r1,r2);
[x1,y1,x2,y2,s1,s2]=exm07052_1(r1,r2);
(3)
r2=0.6;
subplot(1,3,1),exm07052_1(r1,r2),
subplot(1,3,2),exm07052_1(r1,r2,'
Marker'
o'
)
subplot(1,3,3),exm07052_1(r1,r2,'
LineWidth'
5,'
Color'
[10.40])
图7.5-1
7.5.3跨空间变量传递
7.5.3.1跨空间计算串表达式的值
【例7.5.3.1-1】本例演示:
(A)编写绘制正多边形或圆的程序。
(B)子函数与(母)函数的关系。
(C)各种不同的工作空间。
(D)evalin运行机理与eval的异同。
[exm070531_1.m]
functiony1=exm070531_1(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);
clear,a=30;
sss={'
fork=1:
3
y0=exm070531_1(8,sss{k});
subplot(1,3,k)
plot(real(y0),imag(y0),'
r'
3),axissquareimage
end
图7.5-2
7.5.3.2跨空间赋值
【例7.5.3.2-1】assignin运作机理示范。
[exm070532_1.m]
functiony=exm070532_1(x)
y=sqrt(x);
t=x^2;
assignin('
yy'
t)
x=4;
y=exm070532_1(x);
disp([blanks(5),'
x'
blanks(5),'
y'
blanks(4),'
]),disp([x,y,yy])
xyyy
4216
7.5.4子函数和私用函数
7.5.4.1子函数
7.5.4.2私用函数
7.6串演算函数
7.6.1eval
【例7.6.1-1】计算“表达式”串,产生向量值。
clear,t=pi;
cem='
[t/2,t*2,sin(t)]'
y=eval(cem)
y=
1.57086.28320.0000
【例7.6.1-2】计算“语句”串,创建变量。
eval('
theta=t/2,y=sin(theta)'
who
theta=
1.5708
1
Yourvariablesare:
tthetay
【例7.6.1-3】计算“替代”串。
A=ones(2,1);
B=ones(1,3);
c=eval('
B*A'
A*B'
),errmessage=lasterr
c=
111
errmessage=
Errorusing==>
*
Innermatrixdimensionsmustagree.
【例7.6.1-4】计算“合成”串。
CEM={'
cos'
sin'
tan'
theta=pi*k/12;
y(1,k)=eval([CEM{1},'
('
num2str(theta),'
)'
y
0.96590.86600.7071
7.6.2feval
【例7.6.2-1】feval和eval运行区别之一:
feval的FN绝对不能是表达式。
x=pi/4;
Ve=eval('
1+sin(x)'
)
Ve=
1.7071
Vf=feval('
x)
?
Errorusing==>
feval
Invalidfunctionname'
.
【例7.6.2-2】feval和eval调用区别:
feval的FN只接受函数名。
本例两种方法以后者为好。
randn('
seed'
1);
A=rand(2,2);
[ue,de,ve]=eval('
svd(A)'
Resultsbyeval'
disp([ue,de,ve]);
disp(blanks
(1))
[uf,df,vf]=feval('
svd'
A);
Resultsbyfeval'
disp([uf,df,vf])
Resultsbyeval
-0.9193-0.39361.22120-0.7897-0.6135
-0.39360.919300.2633-0.61350.7897
Resultsbyfeval
-0.39360.919300.2633-0.61350.7897
7.6.3内联函数
7.6.3.1内联函数的创建
7.6.3.2涉及内联函数性质的指令
7.6.3.3内联函数创建和应用示例
【例7.6.3.3-1】演示:
内联函数的第一种创建格式;
使内联函数适于“数组运算”。
clear,F1=inline('
sin(rho)/rho'
F1=
Inlinefunction:
F1(rho)=sin(rho)/rho
f1=F1
(2)
f1=
0.4546
FF1=vectorize(F1)
xx=[0.5,1,1.5,2];
ff1=FF1(xx)
FF1=
FF1(rho)=sin(rho)./rho
ff1=
0.95890.84150.66500.4546
【例7.6.3.3-2】演示:
第一种内联函数创建格式的缺陷;
含向量的多宗量输入的赋值。
G1=inline('
a*exp(x
(1))*cos(x
(2))'
),G1(2,[-1,pi/3])
G1=
G1(a)=a*exp(x
(1))*cos(x
(2))
inline/subsref
Toomanyinputstoinlinefunction.
G2=inline('
a'
),G2(2,[-1,pi/3])
G2=
G2(a,x)=a*exp(x
(1))*cos(x
(2))
0.3679
【例7.6.3.3-3】演示:
产生向量输入、向量输出的内联函数;
这种向量函数的调用方法。
Y2=inline('
[x
(1)^2;
3*x
(1)*sin(x
(2))]'
argnames(Y2)
Y2=
Y2(x)=[x
(1)^2;
3*x
(1)*sin(x
(2))]
ans=
x=[4,pi/6];
y2=Y2(x)
y2=
16.0000
6.0000
【例7.6.3.3-4】演示:
最简练格式创建内联函数;
内联函数可被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
7.7函数句柄
7.7.1函数句柄的创建和观察
【例7.7.1-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:
\matlab6p5\toolbox\symbolic\@sym\sin
7.7.2函数句柄的基本用法
【例7.7.2-1】本例通过函数及其句柄演示若干基本用法。
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('
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.7.2-2】本例演示:
如何避免创建“无效函数句柄“问题。
Hy2=@fhzzy%fhzzy.m是随书光盘mfiles文件夹上的一个函数文件。
Hy2=
@fhzzy
class(Hy2)
size(Hy2)
feval(Hy2,'
line'
Undefinedfunction'
fhzzy'
【例7.7.2-3】自建函数及其句柄的使用。
[fhzzy.m]
functionHr=fhzzy(flag)
%fhzzy
100)/100*2*pi;
x=sin(t);
y=cos(t);
Hr=@cirline;
feval(Hr,flag,x,y,t)
%-------------subfunction---------------------------
functioncirline(wd,x,y,t)
switchwd
plot(t,x,'
t,y,'
2)
circle'
plot(x,y,'
g.'
MarkerSize'
30),
axissquareoff
otherwise
输入宗量只能取'
或'
!
shg
Hy3=@fhzzy
fhzzy('
Hy3=
@fhzzy
图7.7-1
which('
fhzzynotfound.
feval('
Undefinedfunctionorvariable'
(5)
feval(Hy3,'
【例7.7.2-4】子函数句柄的创建与使用。
HCL=fhzzy('
HCL=
@cirline
图7.7-2
tt=(0:
xx=sin(tt);
yy=cos(tt);
cirline('
xx,yy,tt);
xx,yy,tt)
cirline'
feval(HCL,'
7.8创建用户工具箱
7.8.1MATLAB对工具箱文件的管理特点
7.8.2建立用户工具箱须知
7.9调试和剖析
7.