chap5 matlab.docx
《chap5 matlab.docx》由会员分享,可在线阅读,更多相关《chap5 matlab.docx(40页珍藏版)》请在冰豆网上搜索。
chap5matlab
第五章MATLAB的GUI程序设计
I程序的对象及相关概念
面向对象的程序设计,其程序是由对象组装起来的。
一个对象通常有自己的属性,事件和方法,它们都不是严格定义的。
按通常的理解,属性确定对象是什么,事件向对象发布消息使其处于活动状态,方法是对象的行为。
以下是它们的要点,大家要在实践中加以总结
1.对象是程序的基本元件。
2.对象通常有属性,属性确定该对象形(外观)。
3.对象通常有行为(方法),行为确定该对象做什么。
4.对象通常有事件,事件向对象传递消息。
5.通常可以为对象编写代码,该代码确定对象的行为。
6.程序中的对象通常处在静止状态,事件可以激活对象,处在活动状态的对象才有行为。
7.属性,事件和方法从属于一个确定的对象。
同一个对象可以有不同的属性,事件和方法,同样的属性,事件和方法也可以从属于不同的对象。
8.对象从属于程序,它通常不能单独运行。
一个程序把一组对象合理的组装起来,通过事件驱动它们。
9.对象有相对的独立性,同一个对象可以从属于不同的程序。
10.Matlab的对象有3类。
一是我们学习过的函数对象,它用函数句柄来表示;二是图形对象,它用各种图形句柄来表示,我们将在下面学习它的使用;三是外部对象,我们以后会学到。
IIMatlab的图形对象及其层次结构
Matlab的图形对象是其程序对象的一种,它是由图形句柄对象来表示的,简称为图形句柄。
图形句柄是Matlab创建图形用户界面(GUI)的基本元素。
这些图形对象及它们的层次结构如下
根屏幕(Root)
图形窗(Figure)
轴(Axes)控件(Uicontrol)菜单(Uimenu)
ImageLineRectangleTextLightPatchSurface
根屏幕(root)
“根屏幕”对应于计算机屏幕,它不需要创建,但可以设置属性值。
其它图形对象都是该对象的“子”。
图形窗(figure)
图形窗是显示图形的窗口,“根屏幕”下可以有多个图形窗,但只有一个是当前窗口。
控件(Uicontrol)
图形窗下的控件主要包括:
按钮,列表框,文件框,滑块等,它是人机交互界面的主要组成部分
菜单(Uimenu)
图形窗下的菜单是下拉式菜单,它是调用子程序的按钮。
轴(axis)
在图形窗口中,“轴对象”定义一个区域,该区域是图形窗的子,同时也是图像,光照,线条等对象的父。
所有绘图指令(如plot,surf,mesh和bar等)都可以创建轴对象。
如果图形窗中有多个轴对象,则只有一个是当前轴对象。
图像(Image)
在轴对象下,一个图像对象由数据矩阵和色数矩阵组成,根据矩阵的不同类型又分索引图像,灰度图像和全彩色图像。
线条(Line)
在轴对象下的“线条”对象为基本的图形元素,用于绘制二,三维图形等。
绘图指令Plot,plot3创建的就是图形对象。
块(Rectangle)
在轴对象下的“块”对象为带有边缘的多边形,绘图指令fill,fill3和contour3创建的是块对象。
文本(Text)
在轴对象下的“文本”对象表示字符串,title,xlabel,ylabel,gtext,text等都可以创建文本对象。
光照(Light)
在轴对象下的“光照”对象设置光源,以影响块和表面对象,用户可以设置光源属性控制颜色,位置和方向等。
表面对象(surface)
在轴对象下由绘图指令做的二三维图形都是表面对象。
III对象句柄属性及意义
1.对象句柄都有各自的属性。
不同的对象句柄也可以有相同的属性
2.每个属性通常都有自己的属性值,决定对象不同的特性。
它通常表现为该对象不同的外观。
3.对象用函数生成。
一个对象在生成时,同时赋予了其属性和属性值
4.对象的属性值,可用set函数改变,可用get函数获取
5.如果不改变属性值,当生成该对象时系统自动取属性的缺省值
6.如果改变属性值,则生成该对象时取该对象属性的当前值
例5.1用set函数对象的属性值
(1)用set函数设置根屏幕的颜色
sphere
set(0,'DefaultFigureColor','b');
sphere
(2)用set函数设置图形边沿的颜色
peaks;
h=get(gcf)
set(gcf,'DefaultSurfaceEdgeColor','r')
peaks;shg
例5.2在两个轴对象上设置不同的属性
t=0:
pi/20:
2*pi;
s=sin(t);
c=cos(t);
figh=figure('position',[30100800350],'DefaultAxesColor',[.8.8.8]);
axh1=subplot(1,2,1);gridon
set(axh1,'DefaultLineLineStyle','-.')
line('Xdata',t,'Ydata',s)
line('Xdata',t,'Ydata',c)
text('Position',[3.4],'string','Sine')
text('Position',[2.3],'string','Cosine','HorizontalAlignment','right')
axh2=subplot(1,2,2);gridon
set(axh2,'DefaultTextRotation',90)
line('Xdata',t,'Ydata',s)
line('Xdata',t,'Ydata',c)
text('Position',[3.4],'string','Sine')
text('Position',[2.3],'string','Cosine','HorizontalAlignment','right')
IV对象句柄的获取,设置与调用
例5.3mesh函数获取peaks图形的句柄,用get函数取图形的图柄(gcf)和轴柄(gca)。
clfreset;H_mesh=mesh(peaks(20))
H_grand_parent=get(get(H_mesh,'Parent'),'Parent')
disp('图柄轴柄'),disp([gcfgca])
说明:
H_mesh是图形peaks的句柄,H_grand_parent是图形窗口的句柄(它是peaks的grandfather),它的缺省值是gcf。
图柄H_mesh的father是轴柄,它的缺省值是gca。
例5.4低层指令绘图,获得句柄;获取同轴上字对象的句柄和相应对象类型。
clfreset,t=(0:
100)/100*2*pi;
H_line=line('Xdata',t,'Ydata',sin(t))
text(pi,0.8,'\fontsize{14}sin(t)')
H_c=get(get(H_line,'parent'),'children')
T=get(H_c,'Type')
说明:
H_line=100.0005是y=sin(t)的图形句柄,H_c是轴柄(gca)的children的句柄,它有两个对象,一个是正弦曲线sin(t)(句柄值为100.0005),另一个是文本“sin(t)”(其句柄值为102.0002)。
例5.5findobj指令的使用。
clfreset,t=(0:
pi/100:
2*pi)';tt=t*[111];yy=sin(tt)*diag([0.511.5]);
plot(tt,yy),Hb=findobj(gca,'Color','r')
点评:
1)作图函数(如mesh,line,plot)作出图形,通常可返回函数的句柄,用get函数可取得图形及其parent,children的句柄,gcf,gca,gco是预定义的句柄常量,可接受当前图形,轴和最近点击的图形句柄。
Hb=findobj(gca,'Color','r')可获得当前轴下不同颜色的句柄。
2)图形上的不同对象对应于不同的句柄
3)以后会看到不同的图形句柄也可以组装成新的图形
例5.6对象属性的获取和设置
clfreset,x=0:
pi/12:
2*pi;
PN1={'Color','LineWidth','Marker'};
%设置属性名元胞数组
PV1={[100],5,'d'};%设置属性值
plot(sin(x),cos(x),PN1,PV1)%根据属性值画图
axissquare
PS.Color=[0.70.70];PS.LineWidth=2;
%用构架数组设置属性名和属性值
line(sin(7*x),cos(7*x),PS);%根据属性值画图
说明:
如本例所示,可用元胞数组和构架数组来设置属性名和属性值
例5.7在不同对象上设置属性和属性值
(1)指令中直接指定线型或/和颜色:
clfreset,t=(0:
pi/50:
2*pi)';k=0.4:
0.1:
1;Y=cos(t)*k;
line(t,Y,'Color',[100],'LineStyle','-.')
(2)轴对象属性'LineStyle'和'ColorOrder'的影响:
clfreset
set(gca,'ColorOrder',[000;0.70.70.7],'LineStyle','-|:
')
line(t,Y)
(3)在“图对象”上,对轴的缺省属性'DefaultAxesLineStyleOrder'和'DefaultAxesColorOrder'设置所产生的影响
clfreset
set(gcf,'DefaultAxesLineStyleOrder','-|:
');
set(gcf,'DefaultAxesColorOrder',[100;001]);
line(t,Y)
说明:
如本例所示,在图形的上级对象上对属性值的设置都会对该图形产生影响
例5.8高层绘图文件的形成
高层作图函数surf.m文件与低层作图指令surface的关系。
[surf.m]
functionh=surf(varargin)
cax=newplot;%建立图形窗和轴,并返回轴句柄
ifnargin==0
error('Notenoughinputarguments.')
%如果没有输入项(即surf),则显示出错信息
elseifnargin==1
%如果输入项只有一项,则进行以下测试
ifmin(size(varargin{1}))==1
%如果输入项只有一项,且该项是1维数组或多维数组的最小维数是
1,则显示以下错误信息
error('Inputargumentmustbeamatrixnotavectororascalar')
else
hh=surface(varargin{1});
%用surface函数画数据varargin{1}
(这里vargargin{1}至少是一个2维数组,且最小维数是大于1)的图形,并返回图形句柄
end
else
hh=surface(varargin{:
});
%输入项至少是两项时,用surface作图
end
if~ishold%如果不处在holdon状态,则进行以下操作
view(3)
gridon
end
ifnargout==1%如果输出宗量为1,则返回图形句柄
h=hh;
end
例5.9演示高层指令mesh,surf等指令是如何由surface衍生而得。
clfreset,t=(0:
20)/20;
r=2.5-cos(2*pi*t);[x,y,z]=cylinder(r,40);
fc=get(gca,'color');
h=surface(x,y,z,'FaceColor',fc,'EdgeColor','flat','FaceLighting','none','EdgeLighting','flat');
view(3);gridon
图9.4-1低层指令产生的网线图
set(h,'FaceColor','flat','LineStyle','-','EdgeColor',[.8.8.8])
图9.4-2通过属性重置获得着色曲面图
set(h,'FaceColor','interp','MeshStyle','column')
图9.4-3通过重置获得新型瀑布水线图
例5.10任意布置子图和轴外注释
本例演示:
axes轴位框设计、rectangle的运用、及轴外注释(图9.5-2)。
所谓轴外注释,实际上是使用了两个轴位框。
一个轴位框充满全部图形窗,其坐标框被隐去,而只写注释文字。
而另一个比较小的轴位框用于绘图。
从外表看去,注释就处于那小轴位框的外部。
clf
zeta2=[0.20.40.60.81.0];n=length(zeta2);%该段录入数据
fork=1:
n;Num{k,1}=1;Den{k,1}=[12*zeta2(k)1];end
S=tf(Num,Den);
t=(0:
0.4:
20)';
[Y,x]=step(S,t);%step是一个函数,产生函数值y
tt=t*ones(size(zeta2));%tt是作图数据点
clfreset,H=axes('Position',[0,0,1,1],'Visible','off');%定义轴H
str{1}='\fontname{隶书}二阶系统阶跃响应';%以下定义字符串
str{2}='y(t)=1-\beta^{-1}e^{-\zetat}sin(\betat+\theta)';
str{3}='';str{4}='\fontname{隶书}其中:
';
str{5}='\beta=(1-\zeta^{2})^{0.5}';
str{6}='\theta=arctg(\beta/\zeta)';
str{7}='\zeta=.2,.4,.6,.8,1';
set(gcf,'CurrentAxes',H)%把轴H放置到当前图形窗(figure)上
text(0.01,0.73,str,'FontSize',12)%把字符串str放置到指定位置
h1=axes('Position',[0.45,0.45,0.5,0.5]);%定义新轴h1
ribbon(tt,Y,0.4)%在新轴上用ribbon函数作图
set(h1,'XTickLabelMode','manual','XTickLabel','0|0.4|0.8|1.2');
%对x轴按指定数据标号,并作网格线
set(h1,'ZTickLabel','0|1.0|2.0');
set(get(h1,'XLabel'),'String','\zeta\rightarrow','Rotation',17.5)
%对x轴标号,以下两句类似
set(get(h1,'YLabel'),'String','\leftarrowt','Rotation',-25)
set(get(h1,'Zlabel'),'String','z\rightarrow')
h2=axes('Position',[0.03,0.08,0.27,0.27]);
%定义新轴h2
plot(tt,Y)
h3=axes('Position',[0.37,0.04,0.63,0.32]);
%定义新轴h3
set(h3,'Xlim',[0,1.2],'Ylim',[0,0.5])
%设置x,y轴的范围,数据比,及颜色
set(h3,'DataAspectRatio',[111])
set(h3,'ColorOrder',[0,0,0])
set(h3,'Visible','off')%h3不可见
hh1=rectangle('Position',[0.5,0.2,0.4,0.2],'Curvature',[0,0]);
%在h3上的指定位置做图(Curvature=[0,0]表示矩形)
hh2=rectangle('Position',[0.2,0.26,0.08,0.08],'Curvature',[1,1]);
%在h3上的指定位置做图(Curvature=[1,1]表示园)
xx1=0.05:
0.01:
0.2;xx2=0.28:
0.02:
0.5;%以下取新数据点
xx3=0.9:
0.02:
1.1;xx4=0.24:
0.02:
1;
yy5=0.1:
0.02:
0.26;yy6=0.1:
0.02:
0.3;
yy1=0.3*ones(size(xx1));yy2=0.3*ones(size(xx2));
yy3=0.3*ones(size(xx3));yy4=0.1*ones(size(xx4));
xx5=0.24*ones(size(yy5));xx6=ones(size(yy6));
%以下按新数据点画线,并标注文字
line(xx1,yy1);line(xx2,yy2);line(xx3,yy3);line(xx4,yy4);
line(xx5,yy5);line(xx6,yy6)
line(0.17,0.3,'Marker','>','MarkerFaceColor','k')
line(0.47,0.3,'Marker','>','MarkerFaceColor','k')
line(1.1,0.3,'Marker','>','MarkerFaceColor','k')
line(0.24,0.23,'Marker','^','MarkerFaceColor','k')
line(0.17,0.35,'Marker','+')
text(0.27,0.23,'-')
text(0.05,0.35,'u(t)')
text(1,0.35,'y(t)')
text(0.6,0.26,'s{^2}+2{\zeta}s');
xx7=0.56:
0.02:
0.84;yy7=0.3*ones(size(xx7));line(xx7,yy7)
text(0.68,0.35,'1')
点评:
1)在同一个图形窗口(Figure)可以设置几个轴(h1,h2,h3),它们的位置由图形窗口(Figure)的轴H设定,如:
h1=axes('Position',[0.45,0.45,0.5,0.5])
这里(0.45,0.45)是h1相对于H的位置,而(0.5,0.5)是h1中x,y轴的长度。
2)每一个图形都是在一个确定的轴下作出的。
在同一个图形窗口上的多个轴,只有一个处在激活状态,图形总是在当前激活的轴下画出的。
3)set(h1,'XTickLabelMode','manual','XTickLabel','0|0.4|0.8|1.2')一句,是在h1轴上设定x轴的刻度。
4)下面的语句是取h1轴上x坐标轴的句柄,并对文字进行标注和旋转
set(get(h1,'XLabel'),'String','\zeta\rightarrow','Rotation',17.5)
5)下面的语句是作矩形对象,Position后面的参数是位置和大小;Curvature后面的参数是指形状,[0,0]表示矩形,[1,1]表示园。
hh1=rectangle('Position',[0.5,0.2,0.4,0.2],'Curvature',[0,0]);
V图形用户界面(GUI)制作
Matlab程序的用户界面,可以用图形句柄通过代码来制作,也可以GUI(GraphicUserInterface)编辑器来制作,或二者结合起来做。
我们分别用下面的例子来加以说明
一.用代码来制作GUI界面
例5.11对于传递函数为
的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。
本例演示:
(A)图形界面的大致生成过程;
(B)静态文本和编辑框的生成;
(C)坐标网格控制键的形成;
(D)如何使用该界面。
(1)产生图形窗和轴位框:
如图5.1-1所示。
clfreset
%set(0,'DefaultFigureColor','b')
H=axes('unit','normalized','position',[0,0,1,1],'visible','off');
%建立轴,并取轴句柄H
set(gcf,'currentaxes',H);%在当前图形窗口上安置坐标轴H
str='\fontname{隶书}归一化二阶系统的阶跃响应曲线';
text(0.12,0.93,str,'fontsize',13);%在H上,相对于左下角的取值
h_fig=get(H,'parent');%取H的父句柄h_fig=gcf
set(h_fig,'unit','normalized','position',[0.1,0.2,0.7,0.4]);
%设置图形窗口h_fig的位置[0.1,0.2,0.7,0.4](相对于轴H?
)
h_axes=axes('parent',h_fig,...
'unit','normalized','position',[0.1,0.15,0.55,0.7],...
'xlim',[015],'ylim',[01.8],'fontsize',8);
%在H窗口上指定位置画新轴
图5.1-1产生坐标轴
(2)在坐标框右侧生成作解释用的“静态文本”和可接收输入的“编辑框”:
如图10.1-2所示。
h_text=uicontrol(h_fig,'style','text',...
'unit','normalized','position',[0.67,0.73,0.25,0.14],...
'horizontal','left','string',{'输入阻尼比系数','zeta='});
%在图形窗口(h_fig)指定位置[0.67,0.73,0.25,0.14]上生成文本标签
h_edit=uicontrol(h_fig,'style','edit',...
'unit','normalized','position',[0.67,0.59,0.25,0.14],...
'horizontal','left',...
'callback',[...
'z=str2num(get(gcbo,''string''));',...
't=0:
0.1:
15;',...
'fork=1:
length(z);',...
'y(:
k)=step(1,[12*z(k)1],t);',...
'plot(t,y(:
k