当前位置:首页 >> 信息与通信 >>

实用MATLAB教程第四章


第 4 章 MATLAB 计算的可视化和 GUI 设计
MATLAB 不仅具有强大的数值运算功能, 也同样具有非常强大的二维和三维绘图功能, 尤其擅长于各种科学运算结果的可视化。 计算的可视化可以将杂乱的数据通过图形来表示从 中观察出其内在的关系;MATLAB 的图形命令格式简单,可以使用不同线型、色彩、数据 点标记和标注等来修饰图形;而且 MATLAB 也可以设计出图形用户界面,方便地进行人机 交互。

4.1 二维曲线的绘制
4.1.1 基本绘图命令 plot
plot 命令是 MATLAB 中最简单而且使用最广泛的一个绘图命令,用来绘制二维曲线。 语法: 语法: plot(x) %绘制以 x 为纵坐标的二维曲线 plot(x,y) %绘制以 x 为横坐标 y 为纵坐标的二维曲线 说明:x 和 y 可以是向量或矩阵。 1. plot(x) 绘制 x 向量曲线 当 x 是长度为 n 的数值向量,则坐标系的纵坐标为向量 x,横坐标为 MATLAB 系统根 据 x 向量的元素序号自动生成的从 1 开始的向量。 plot(x)命令是在坐标系中顺序地用直线段连接各点,生成一条折线,当向量的元素充分 多时,可以得到一条光滑的曲线。 【例 4.1】用 plot(x)命令画直线,如图 4.1 所示。 】

图 4.1 (a) x1 曲线 >> x1=[1 2 3] x1 = 1 2 >> plot(x1) >> x2=[0 1 0]

(b) x2 曲线

3

x2 = 0 1 >> plot(x2) 0

2. plot(x,y) 绘制向量 x 和 y 的曲线 当参数 x 和 y 都是长度为 n 的向量,x、y 的长度必须相等,plot(x,y)命令绘制纵坐标为 向量 y 横坐标为向量 x 的曲线。 【例 4.2】绘制正弦曲线 y=sin(x)和方波曲线,如图 4.2 所示。 】
>> x1=0:0.1:2*pi; >> y1=sin(x1); >> plot(x1,y1) >> x2=[0 1 1 2 2 3 ]; >> y2=[1 1 0 0 1 1 ]; >> plot(x2,y2) >> axis([0 4 0 2]) %y1 为 x1 的正弦函数

%将坐标轴范围设定为 0-4 和 0-2

图 4.2 (a) 正弦曲线

(b) 方波曲线

3. plot(x) 绘制矩阵 x 的曲线 当 x 是一个 m×n 的矩阵,plot(x)命令为矩阵的每一列画出一条线,共 n 条曲线,各曲 线自动用不同颜色表示;每条线的横坐标为向量 1:m,m 是矩阵的行数,绘制方法与向量相 同。 【例 4.3】矩阵图形的绘制,如图 4.3 所示。 】

图 4.3 (a) x1 曲线 >> x1=[1 2 3;4 5 6];

(b) x2 曲线

>> plot(x1) >> x2=peaks; >> plot(x2)

%产生一个 49*49 的矩阵

程序分析:a 图中有三条曲线而不是两条曲线,因为矩阵 x1 有三列,每列向量画一条 曲线;b 图为由 peaks 函数生成的一个 49×49 的二维矩阵,因此产生 49 条曲线。 4. plot(x,y)绘制混合式曲线 绘制混合式曲线 当 plot(x,y)命令中的参数 x 和 y 是向量或矩阵时,分别有以下几种情况: 如果 x 是向量,而 y 是矩阵,则 x 的长度与矩阵 y 的行数或列数必须相等,如果 x 的长度与 y 的行数相等,则向量 x 与矩阵 y 的每列向量对应画一条曲线;如果 x 的长度与 y 的列数相等,向量 x 与 y 的每行向量画一条曲线,如果 y 是方阵,则 x 和 y 的行数和列数都 相等,将向量 x 与矩阵 y 的每列向量画一条曲线; 如果 x 是矩阵,而 y 是向量,则 y 的长度必须等于 x 的行数或列数,绘制的方法与 前一种相似; 如果 x 和 y 都是矩阵,则大小必须相同,矩阵 x 的每列和 y 的每列画一条曲线。 【例 4.4】混合式图形的绘制,如图 4.4 所示。 】
>> x1=[1 2 3]; >> y1=[1 2 3;4 5 6] y1 = 1 2 3 4 5 6 >> plot(x1,y1) >> y2=[1 2 ;3 4; 5 6] y2 = 1 2 3 4 5 6 >> plot(x1,y2)

%每行一条曲线

%每列一条曲线

图 4.4 (a) (x1,y1)曲线 曲线 >> plot(y1,x1) >> plot(y2,x1)

(b) (x2,y1)曲线 曲线

图 4.4 ( c) (y1,x1)曲线 曲线 >> x2=[1 1 1;2 2 2] x2 = 1 1 1 2 2 2 >> plot(x2,y1)

(d) (y2,x1)曲线 曲线

%按列与列对应的方式

图 4.4 (e) (x2,y1)曲线 曲线

5. plot(z)绘制复向量曲线 绘制复向量曲线 plot(z)中的参数 z 为复向量时, plot(z)和 plot(real(z),imag(z))是等效的, 以实部为横坐标, 虚部为纵坐标。 【例 4.4 续】下面的程序画出的曲线和图 4.4(e)中的相同。
>> z1=x2+i*y1 z1 = 1.0000 + 1.0000i 1.0000 + 2.0000i 1.0000 + 3.0000i 2.0000 + 4.0000i 2.0000 + 5.0000i 2.0000 + 6.0000i >> plot(z1) %以实部为横坐标,虚部为纵坐标

注意: 当 plot(x,y)的参数 x 或 y 中只有一个是复变量,则 MATLAB 会忽略复变量的虚部。 6. plot(x1,y1,x2,y2,…)绘制多条曲线 绘制多条曲线 plot 命令还可以同时绘制多条曲线,用多个矩阵对为参数,MATLAB 自动以不同的颜 色绘制不同曲线。每一对矩阵(xi,yi)均按照前面的方式解释,不同的矩阵对之间,其维数可 以不同。 【例 4.5】绘制三条曲线,如图 4.5 所示。 】

>> x=0:0.1:2*pi; >> plot(x,sin(x),x,cos(x),x,sin(3*x))

%画三条曲线

图 4.5

三条曲线

4.1.2 绘制曲线的一般步骤
在 MATLAB 中,无论是绘制二维还是三维图形,如果要画出相当满意的彩色图形,还 要对图形进行各种修饰,表 4.1 为绘制二维、三维图形一般步骤的归纳。
绘制二维、 表 4.1 绘制二维、三维图形的一般步骤 步骤 1 内容 曲线数据准备: 对于二维曲线,横坐标和纵坐标数据变量; 对于三维曲面,矩阵参变量和对应的函数值。 指定图形窗口和子图位置: 2 默认时,打开 Figure No.1 窗口或当前窗口、当前子图; 也可以打开指定的图形窗口和子图。 3 设置曲线的绘制方式: 线型、色彩、数据点形。 4 设置坐标轴: 坐标的范围、刻度和坐标分格线 5 图形注释: 图名、坐标名、图例、文字说明 6 7 8 着色、明暗、灯光、材质处理(仅对三维图形使用) 视点、三度(横、纵、高)比(仅对三维图形使用) 图形的精细修饰(图形句柄操作): 利用对象属性值设置; 利用图形窗工具条进行设置。

说明: 步骤 1 和 3 是最基本的绘图步骤, 如果利用 MATLAB 的默认设置通常只需要这两个 基本步骤就可以基本绘制出图形,而其他步骤并不完全必需。

步骤 2 一般在图形较多的情况下,需要指定图形窗口、子图时使用。 除了步骤 1、2、3 的其他步骤用户可以根据自己需要改变前后次序。

4.1.3 多个图形绘制的方法
在上小节中表 4.1 的步骤 2 为当需要绘制多个图形时,需要指定图形窗口和子图,或者 在同一个图形窗口中层叠绘制图形。 1. 指定图形窗口 在 4.1.1 小节中介绍的 plot 命令,绘制的图形都是在默认的“Figure No.1”窗口中绘制 的,当第二次使用 plot 命令时,就将第一次绘制的图形覆盖了。因此,如果需要多个图形 窗口同时打开时,可以使用 figure 语句。 语法: 语法: figure(n) %产生新图形窗口 说明:如果该窗口不存在,则产生新图形窗口并设置为当前图形窗口,该窗口名为 “Figure No.n”,而不关闭其它窗口。 例如,可以使用“figure (1)”、“figure (2)”等语句来同时打开多个图形窗口。 2. 同一窗口多个子图 如果需要在同一个图形窗口中布置几幅独立的子图,可以在 plot 命令前加上 subplot 命 令来将一个图形窗口划分为多个区域,每个区域一幅子图。 语法: 语法: subplot(m,n,k) %使(m×n)幅子图中的第 k 幅成为当前图 说明:将图形窗口划分为 m×n 幅子图,k 是当前子图的编号,“,”可以省略。子图的 序号编排原则是:左上方为第 1 幅,先向右后向下依次排列,子图彼此之间独立。 【例 4.6】用 subplot 命令画四个子图,如图 4.6 所示。 】
>> x=0:0.1:2*pi; >> subplot(2,2,1) >> plot(x,sin(x)) >> subplot(2,2,2) >> plot(x,cos(x)) >> subplot(2,2,3) >> plot(x,sin(3*x)) >> subplot(224) >> plot(x,cos(3*x)) %分割为 2*2 个子图,左上方为当前图 %右上方为当前图 %左下方为当前图 %右下方为当前图,省略逗号

图 4.6

四个子图

如果在使用绘图命令之后,想清除图形窗口画其它图形,应使用“clf”命令清图形窗。
>> clf %清除子图

3. 同一窗口多次叠绘 在当前坐标系中绘图时,每调用一次 plot 函数,会擦掉图形窗口中已有的图形。为了 在一个坐标系中增加新的图形对象,可以用“hold”命令来保留原图形对象。 语法: 语法: hold on %使当前坐标系和图形保留 hold off %使当前坐标系和图形不保留 hold %在以上两个命令中切换 说明:在设置了“hold on”后,如果画多个图形对象,则在生成新的图形时保留当前 坐标系中已存在的图形对象,MATLAB 会根据新图形的大小,重新改变坐标系的比例。 【例 4.7】在同一窗口画出函数 sinx 在区间[0 2π]的曲线和 cosx 在区间[-π π]的曲线, 例 如图 4.7(a)所示。
>> x1=0:0.1:2*pi; >> plot(x1,sin(x1)) >> hold on >> x2=-pi:.1:pi; >> plot(x2,cos(x2))

程序分析:坐标系的范围由 0~2π转变为-π~2π。 4. 双纵坐标图 在实际应用中常常需要把同一自变量的两个不同量纲、 不同数量级的函数量的变化绘制 在同一张图上。例如在同一张图上画出放大器输入、输出电流的时间变化曲线;电压、电流 的时间变化曲线;温度、压力的时间响应曲线等。MATLAB 使用 plotyy 命令可以实现在同 一图形中使用左右双纵坐标来绘制曲线。 语法: 语法: plotyy(x1,y1,x2,y2) %以左、右不同纵轴绘制两条曲线 说明: 左纵轴用于(x1,y1)数据, 右纵轴用于(x2,y2)数据来绘制两条曲线。 坐标轴的范围、 刻度都自动产生。 【例 4.7 续】用 plotyy 函数实现在同一图形窗口绘制两条曲线,如图 4.7(b)所示。 例

>> plotyy(x1,sin(x1),x2,cos(x2))

程序分析:plotyy 函数用不同颜色绘制两条曲线,左右两边使用两个纵坐标轴,横坐标 从-π~2π。

图 4.7 (a) 用 hold on 在同一窗口画出两条曲线

(b) 用 plotyy 在同一窗口画出两条曲线

4.1.4 曲线的线型、颜色和数据点形 曲线的线型、
前面介绍的 plot 命令的多种调用方式时, MATLAB 自动以默认方式设置各曲线的线型、 线段的颜色和数据点形等,实际上,plot 命令还可以设置曲线的线段类型、颜色和数据点形 等,如表 4.2 所示。
线段、 表 4.2 线段、颜色与数据点形 颜色 类型 黄色 品红色(紫色) 青色 红色 绿色 蓝色 白色 黑色 符号 y(Yellow) m(Magenta) c(Cyan) r(Red) g(Green) b(Blue) w(White) k(Black) 数据点间连线 类型 实线(默认) 点线 点划线 虚线 符号 : -. -数据点形 类型 实点标记 圆圈标记 叉号形× 十字形+ 星号标记* 方块标记□ 钻石形标记◇ 向下的三角形标记 向上的三角形标记 向左的三角形标记 向右的三角形标记 五角星标记☆ 六连形标记 符号 . o x + * s d v ^ < > p h

在 plot 命令中可以使用表 4.2 中符号组成的字符串,来控制所画线的线段类型、颜色 和数据点形。 语法: 语法: plot(x,y,s)

说明:x 为横坐标矩阵,y 为纵坐标矩阵,s 为类型说明字符串参数;s 字符串可以是线 段类型、颜色和数据点形三种类型的符号之一,也可以是三种类型符号的组合。 【例 4.8】用不同线段类型、颜色和数据点形画出 sinx 和 cosx 曲线,如图 4.8 所示。 例
>> x=0:0.1:2*pi; >> plot(x,sin(x),'r-.') >> hold on >> plot(x,cos(x),'b:o') %用红色点划线画出曲线 %用蓝色圆圈画出曲线,用点线连接

图 4.8 在同一窗口画出两条曲线

4.1.5 设置坐标轴和文字标注
1. 坐标轴的控制 plot 命令根据所给的坐标点自动地确定坐标轴的范围, 用坐标控制命令 axis 来控制坐标 轴的特性,表 4.3 列出其常用控制命令。
表 4.3 常用的坐标控制命令 命令 axis auto axis manual 含义 使用默认设置 使当前坐标范围不变 命令 axis equal axis fill 含义 纵、横轴采用等长刻度 在 manual 方式下起作用,使坐标充 满整个绘图区 axis off 取消轴背景 axis image 纵、 横轴采用等长刻度, 且坐标框紧 贴数据范围 axis on axis ij axis xy axis([xmin,xmax, ymin,ymax]) 使用轴背景 矩阵式坐标,原点在左上方 普通直角坐标,原点在左下方 设定坐标范围,必须满足 xmin<xmax,ymin<ymax,可以取 inf 或-inf。 axis normal axis square axis tight axis vis3d 默认矩形坐标系 产生正方形坐标系 把数据范围直接设为坐标范围 保持高宽比不变, 用于三维旋转时避 免图形大小变化

2. 分格线和坐标框 (1) 使用 grid 命令显示分格线 语法: 语法:

grid on %显示分格线 grid off %不显示分格线 grid %在以上两个命令间切换 说明:不显示分格线是 MATLAB 的默认设置。分格线的疏密取决于坐标刻度,如果要 改变分格线的疏密,必须先定义坐标刻度。 (2) 使用 box 命令显示坐标框 语法: 语法: box on %使当前坐标框呈封闭形式 box off %使当前坐标框呈开启形式 box %在以上两个命令间切换 说明:在默认情况下,所画的坐标框呈封闭形式。 【例 4.9】在两个子图中使用坐标轴、分格线和坐标框控制,如图 4.9 所示。 例
>> x=0:0.1:2*pi; >> subplot(2,1,1) >> plot(sin(x),cos(x)) >> axis equal %纵、横轴采用等长刻度 >> grid on %加分格线 >> subplot(2,1,2) >> plot(x,exp(-x)) >> axis([0,3,0,2]) %改变坐标轴范围

用坐标轴、 图 4.9 用坐标轴、分格线和坐标框控制

3. 文字标注 图形的文字标注是指在图形中添加标识性的注释,文字标注包括:图名(Title)、坐标轴 名(Label)、文字注释(Text)和图例(Legend)。 (1) 添加图名 语法: 语法: title(s) %书写图名 说明:s 为图名,为字符串,可以是英文或中文。 (2) 添加坐标轴名

语法: 语法: xlabel(s) %横坐标轴名 ylabel(s) %纵坐标轴名 (3) 添加图例 语法: 语法: legend(s,pos) %在指定位置建立图例 legend off %擦除当前图中的图例 说明: 参数 s 是图例中的文字注释, 如果多个注释则可以用’s1’,’s2’,…的方式; 参数 pos 是图例在图上位置的指定符,它的取值如表 4.4 所示。
表 4.4 pos 取值 图例位置 0 自动取最佳位置 1 右上角(默认) pos 取值所对应的图例位置 2 左上角 3 左下角 4 右下角 -1 图右侧

用 legend 命令在图形窗口中产生图例后,还可以用鼠标对其进行拖拉操作,将图例拖 到满意的位置。 (4) 添加文字注释 语法: 语法: text(xt,yt,s) %在图形的(xt,yt)坐标处书写文字注释 【例 4.10】在图形窗口中添加文字注释,如图 4.10 所示。 例
>> x=0:0.1:2*pi; >> plot(x,sin(x)) >> hold on >> plot(x,cos(x),'ro') >> title('y1=sin(x),y2=cos(x)') >> xlabel('x') >> legend('sin(x)','cos(x)',4) >> text(pi,sin(pi),'x=\pi')

%添加标题 %添加横坐标名 %在右下角添加图例 %在 pi,sin(pi)处添加文字注释

图 4.10 添加图形标注

4. 特殊符号

如果需要对图形中的文字标识使用特殊字符如希腊字母、数学符等,则可以使用如表 4.5 所示的对应字符,如上例中的“text(pi,sin(pi),'x=\pi')”显示了希腊字符“π” 。
图形标识用的希腊字母、 表 4.5 图形标识用的希腊字母、数学符号和特殊字符 类别 希 腊 字 母 命令 \ alpha \ beta \ epsilon \ gamma \ Gamma \ delta \ Delta \ omega \ Omega 数 学 符 号 \approx \geq \int \sim \cup \surd 箭 头 \uparrow \leftrightarrow 字符 α β ε γ Γ δ Δ ω Ω ≈ ≥ ∫ ≌ ∪ √ ↑ 命令 \ eta \ theta \ Theta \ iota \ zeta \ kappa \ mu \ lambda \ Lambda \oplus \pm \exists \forall \cap \otimes \downarrow \updownarrow ↓ 字符 η θ Θ ι ζ κ μ λ Λ ≡ ± ∝ ~ ∩ 命令 \ nu \ xi \ Xi \ pi \ Pi \ rho \ tau \ sigma \ Sigma \neq \times \infty \angle \vee \oplus \rightarrow → \leftarrow ← 字符 ν ξ Ε π Π ρ τ σ Σ ≠ × ∞ ∠ ∨ \leq \div \in \perp \wedge ≤ ÷ ∈ ⊥ ∧ 命令 \ upsilon \ Upsilon \ phi \ Phi \ chi \ psi \ Psi 字符 υ Υ φ Φ χ ψ Ψ

如果需要对文字进行上下标设置,或设置字体大小,则必须在文字标识前先使用表 4.6 中所示的设置值。
表 4.6 文字设置 命令 \fontname{s} \fontsize{n} \s ^{s} _{s} 含义 字体的名称,s 为 Times New Roman 、Courier、宋体等。 字号大小,n 为正整数,默认为 10(points)。 字体风格,s 可以为 bf(黑体)、it(斜体一)、sl(斜体二)、rm(正体)等。 将 s 变为上标 将 s 变为下标


【例 4.11】在 MATLAB 的图形窗口中写出标题为表达式 y(ω) = 例 为 16 号,如图 4.11 所示。
>> figure(1) >> title('\fontsize{16}y(\omega)=\int^{\infty}_{0}y(t)e^{-j\omegat}dt')



y(t)e ? jωt dt ,字体大小

0

图 4.11 特殊字符

4.1.6 交互式图形命令
在 MATLAB 中还可以通过鼠标进行图形操作,主要有 ginput 和 gtext 命令。 1. ginput 命令 ginput 命令与其他图形命令的原理不同, 不是把数据表现在图上, 而是从图上获取数据。 因此,ginput 命令在数值优化、工程设计中十分有用,仅适用于二维图形。 语法: 语法: [x,y]=ginput(n) %用鼠标从图形上获取 n 个点的坐标(x,y) 说明:参数 n 应为正整数,是通过鼠标从图上获得数据点的个数;x、y 用来存放所取 点的坐标。 操作方法:当 ginput 命令运行后,会把当前图形从后台调到前台,同时鼠标光标变为 十字叉,用户移动鼠标将十字叉移到待取坐标点,单击鼠标左键,便获得该点坐标;此后, 用同样的方法,获取其余点的坐标;当 n 个点的数据全部取到后,图形窗口便退回后台,回 到 ginput 执行前的环境。为了使用 ginput 命令能准确选点,可以先对图进行局部放大处理。 2. gtext 命令 gtext 命令是把字符串放置到图形中鼠标所指定的位置上,该命令对二维、三维图形都 适用。 语法: 语法: gtext(‘s’) %用鼠标把字符串放置到图形上 说明:如果参数 s 是单个字符串或单行字符串矩阵,那么一次鼠标操作就可把全部字符 以单行形式放置在图上;如果参数 s 是多行字符串矩阵,那么每操作一次鼠标,只能放置一 行字符串,需要通过多次鼠标操作,把一行一行字符串放在图形的不同位置。 操作方法:运行 gtext 命令后,当前图形窗口自动由后台转为前台,鼠标光标变为十字 叉;移动鼠标到希望的位置,单击鼠标右键,将字符串 s 放在紧靠十字叉点的第一象限位置 上。 【例 4.12】在 y=sin(x)的图形中将(π,0)和(2π,0)点的坐标取出,并在(2π,0)点写 例 “2π”字符串。
>> x=0:0.1:2*pi; >> plot(x,sin(x)) >> [m,n]=ginput(2) m= 3.1532 6.2984 n= -0.0029 -0.0088 >> gtext('2\pi')

%取两点坐标

%写 2π

程序分析:由于鼠标所取点的位置有些偏差,因此 ginput 命令获取的坐标并不是精确 在(π,0)和(2π,0)点上;gtext 命令在图中鼠标单击处写了“2π”字符串。

4.2 MATLAB 的三维图形绘制
4.2.1 绘制三维线图命令 plot3
在 MATLAB 的三维图形命令中 plot3 最易于理解,plot3 是用来绘制三维曲线的,它的 使用格式与二维绘图的 plot 命令很相似。 语法: 语法: plot3(x,y,z, 's') %绘制三维曲线 plot3(x1,y1,z1, 's1',x2,y2,z2, 's2',…) %绘制多条三维曲线 说明:当 x、y、z 是同维向量时,则绘制以 x、y、z 元素为坐标的三维曲线;当 x、y、 z 是同维矩阵时,则绘制三维曲线的条数等于矩阵的列数。s 是指定线型、色彩、数据点形 的字符串。 【例 4.13】三维曲线绘图,如图 4.12 所示。 例
>> x=0:0.1:20*pi; >> plot3(x,sin(x),cos(x)) %按系统默认设置绘图

图 4.12 三维曲线

4.2.2 绘制三维网线图和曲面图
三维网线图和曲面图是三维立体图形, MATLAB 提供了 mesh 命令绘制三维网线图, surf 命令绘制三维曲面图,这两个命令都能用不同的颜色表示不同的高度。 三维立体图形的绘制比三维线图稍微复杂,在数据准备上需要使用 meshgrid 命令构成 x-y 平面上的自变量栅格点矩阵,另外绘制的立体图形还可以进行色彩、明暗、光照和视点 的处理。 1. meshgrid 命令

为了绘制三维立体图形,MATLAB 的方法是将 x 方向划分为 m 份,将 y 方向划分为 n 份,由各划分点分别作平行于坐标轴的直线,则划分出 m×n 个栅格,然后计算出各栅格点 对应的 f(x,y),绘制出立体曲面和网线图。如果不清楚 meshgrid 命令产生的输出,可以用 mesh 命令来查看。 meshgrid 命令是以 x、y 向量为基准,来产生在 x-y 平面的各栅格点坐标值的矩阵。 语法: 语法: [X,Y]=meshgrid(x,y) = 说明:X、Y 是栅格点的坐标,为矩阵;x、y 为向量。 例如,将 x(1×m)向量和 y(1×n)向量转换为(n×m)的矩阵:
>> x=[1 2 3 4]; >> y=[5 6 7]; >> [xx,yy]=meshgrid(x,y) xx = 1 2 3 1 2 3 1 2 3 yy = 5 5 5 6 6 6 7 7 7

4 4 4 5 6 7

【例 4.14】使用 peaks 函数来测试 meshgrid 命令,并使用 mesh 命令来查看 meshgrid 的 例 输出。 为了方便测试立体图,MATLAB 提供了 peaks 函数,可以产生一个凹凸有致的曲面, 包含三个局部极大点和三个局部极小点,在下面的图 4.13 中可以看到。其 x 和 y 坐标分别 为在[-3 3]范围内的 49×49 的矩阵,z 坐标与 x、y 的关系为: z = 3*(1-x).^2.*exp(-(x.^2) - (y+1).^2) ... - 10*(x/5 - x.^3 - y.^5).*exp(-x.^2-y.^2) ... - 1/3*exp(-(x+1).^2 - y.^2)
>> x=linspace(-3,3,49); >> y=linspace(-3,3,49); >> [xx,yy]=meshgrid(x,y) ; >> mesh(xx) >> mesh(yy)

%产生 49*49 的栅格点坐标 %查看 xx 的网线图

xx 和 yy 分别为 49×49 的矩阵,如图 4.13 为 xx 和 yy 的网状图。

图 4.13 (a) xx 的网格图

(b) yy 的网格图

>> zz=3*(1-xx).^2.*exp(-(xx.^2) - (yy+1).^2) ... - 10*(xx/5 - xx.^3 - yy.^5).*exp(-xx.^2-yy.^2) ... - 1/3*exp(-(xx+1).^2 - yy.^2) %产生 peaks 函数 >> plot3(xx,yy,zz)

程序分析:zz 也是 49×49 的矩阵,绘制三维曲线图如图 4.14 所示。

图 4.14

peaks 函数的三维线图

2. 三维网线图 语法: 语法: mesh(z) %画三维网线图 mesh(x,y,z,c) 说明: 当只有参数 z 时, z 矩阵的行下标作为 x 坐标轴, z 的列下标当作 y 坐标轴; 以 把 x、y 分别为 x、y 坐标轴的自变量;当有 x、y、z 参数时,c 是指定各点的用色矩阵,当 c 省略时默认用色矩阵是 z 的数据。如果 x、y、z、c 四个参数都有,则应该都是维数相同的 矩阵。 【例 4.14 续】用 mesh 查看 peaks 函数的三维网线图,如图 4.15 所示。 例
>> mesh(xx,yy,zz)

图 4.15

peaks 函数的三维网线图

3. 三维曲面图 语法: 语法: surf (z) %画三维曲面图 surf (x,y, z,c) 说明:参数设置与 mesh 命令相同,c 也可以省略。 【例 4.14 续】用 surf 查看 peaks 函数的三维曲面图,如图 4.16 所示。 例
>> surf (xx,yy,zz)

图 4.16

peaks 函数的三维曲面图

4. 其它立体网线图和曲面图 立体网线图 mesh 命令还有几种格式,meshc 命令为立体网状图加等高线;meshz 为立 体网状图加“围裙” 。 【例 4.14 续】用 meshz 和 meshc 查看 peaks 函数的三维曲面图,如图 4.17 所示。 例
>> meshz(xx,yy,zz) >> meshc(xx,yy,zz)

函数的曲面加“围裙” 图 4.17 (a) peaks 函数的曲面加“围裙”图

(b) peaks 函数的曲面图加等高线

立体曲面图 surf 命令也还有几种格式,surfc 命令为三维网线图加等高线;surfl 为三维 网线图加上光源,语法格式为 surf l(x,y,z,c,S),S 为确定光源方向的三维数组(Sx,Sy,Sz)。

4.2.3 立体图形与图轴的控制
在绘制三维立体图时,MATLAB 提供了对图形和图轴的多种精细控制。 1.网格的隐藏 . 在默认方式下,MATLAB 在绘制图形时前面的图形会遮盖后面的图形,即后面的网格 会隐藏,如果要使被遮盖的网格也能呈现出来,可用“hidden off”命令。 语法: 语法: hidden off %显示被遮盖的网格 hidden on %隐藏被遮盖的网格 【例 4.15】显示被遮盖的网格,如图 4.18 所示。 例
>> [x,y,z]=peaks; >> mesh(x,y,z) >> hidden off %peaks 函数 %绘制曲面图 %显示网格

图 4.18 显示网线的 peaks 函数

2.改变视角 . 立体图形的观测角度是由方位角和俯仰角决定的,与 x 平面所成的夹角称为方位 角 (Azimuth),与 z 平面所成的夹角称为俯仰角(Elevation)。对二维图形默认方位角=0°,俯 仰角=90°;对三维图形默认方位角=-37.5°,俯仰角=30°。 三维图形的观测角度不同则显示也不同,如果要改变观测角度,可用“view”命令。 语法: 语法: view([az,el]) %通过方位角和俯仰角改变视角 view([vx,vy,vz]) %通过直角坐标改变视角 说明:az 表示方位角,el 表示俯仰角;vx、vy、vz 表示直角坐标。 【例 4.15 续】改变 peaks 函数的视角,如图 4.19 所示。 例
>> view(0,0) >> view(0,90)

>> view(-37.5,30)

%恢复原视角

图 4.19

(a) 视角为 视角为(0,0)的 peaks 函数 的

(b) 视角为 视角为(0,90)的 peaks 函数 的

程序分析:视角为(0,0),得到一个(x,z)的二维图形效果;视角为(0,90),得到一个(x,y) 的二维图形效果。 3.曲面的镂空 . MATLAB 默认绘制的曲面不透明,当有时希望看到曲面图下面的部分,可以将曲面镂 空。 MATLAB 中可以在希望镂空的位置用 NaN(nan)来取代矩阵在该部分的数值, 在 所有的 MATLAB 作图函数都会忽略 NaN 数据点,实现“镂空”效果。 【例 4.15 续】对 peaks 函数曲面实现镂空效果,如图 4.20 所示。 例
>> z(10:20,10:20)=nan; >> surf(x,y,z) %将一部分数值用 nan 替换 %画曲面图

镂空部分

图 4.20 peaks 函数

4.2.4 色彩的控制
色彩在表现图形中非常重要, MATLAB 特别重视色彩的处理, MATLAB 具有丰富的色 彩控制命令。 1.色图(colormap) .色图

色图是 MATLAB 着色的基础,每个图形窗口只能有一个色图。色图是一个 m×3 的矩 阵,m 的值通常是 64,代表真正用到的颜色个数,而每一行的三列组成一个颜色的 RGB 三 元色组。 (1) RGB 三元组 RGB 三元行数组表示一种色彩,数组元素 R、G、B 在 0~1 之间,分别表示红、绿、 蓝基色的相对亮度,通过三色的设置可以调制出不同颜色,如表 4.7 所示。
表 4.7 常用颜色的 RGB 成分 颜色 Black(黑) White(白) Red(红) Green(绿) Blue(蓝) Yellow(黄) Magenta(品红) Cyan(青) Gray(灰) Dark red(暗红) Copper(铜色) Aquamarine(碧绿) RGB 成分 Red(红色 红色) 红色 0 1 1 0 0 1 1 0 0.5 0.5 1 0.49 Green(绿色 绿色) 绿色 0 1 0 1 0 1 0 1 0.5 0 0.62 1 Blue(蓝色 蓝色) 蓝色 0 1 0 0 1 0 1 1 0.5 0 0.4 0.83

【例 4.16】查看默认的色图矩阵。 例
>> peaks; %以默认颜色显示 peaks 函数曲面 >> colormap ans = 0 0 0.5625 0 0 0.6250 0 0 0.6875 0 0 0.7500 0 0 0.8125 0 0 0.8750 0 0 0.9375 0 0 1.0000 0 0.0625 1.0000 0 0.1250 1.0000 ……. 0.6875 0 0 0.6250 0 0 0.5625 0 0 >> size(colormap) ans = 64 3

程序分析:peaks 函数的颜色如前图 4.15 所示,colormap 是 64×3 的矩阵,为了节省篇 幅在此省略了中间的一些行数,每行为 RGB 颜色的相对亮度。第一行的颜色设定该曲面的 最高点,最后一行的颜色设定该曲面的最低点,其余高度的颜色则根据线性内插法来决定。

(2) 预定义色图函数 MATLAB 系统提供了现成的可以预定义色图的函数,如表 4.8 所示为预定义色图的函 数表。
表 4.8 预定义色图的函数表 命令 hsv hot cool summer gray copper autumn winter spring bone pink flag jet prim 说明 HSV 的颜色对照表(默认值),以红色开始和结束 代表暖色对照表,黑、红、黄、白浓淡色 代表冷色对照表,青、品红浓淡色 代表夏天色对照表,绿、黄浓淡色 代表灰色对照表,灰色线性浓淡色 代表铜色对照表,铜色线性浓淡色 代表秋天颜色对照表,红、黄浓淡色 代表冬天色对照表,蓝、绿浓淡色 代表春天色对照表,青、黄浓淡色 代表“X 光片”的颜色对照表 代表粉红色对照表,粉红色线性浓淡色 代表“旗帜”的颜色对照表,红、白、蓝、黑交错色 HSV 的变形,以蓝色开始和结束 代表三棱镜对照表,红、橘黄、黄、绿、蓝交错色

上表每行的函数默认产生一个 64×3 的色图矩阵,可以改变函数的参数产生一个 m×3 的色图矩阵,如 hot(8)产生 8×3 的矩阵。可以使用 colormap 命令改变色图得到不同颜色的 曲面。 【例 4.16 续】查看暖色色图。 例
>> colormap hot(8) >> colormap ans = 0.3333 0 0.6667 0 1.0000 0 1.0000 0.3333 1.0000 0.6667 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 %产生暖色 peaks 函数曲面

0 0 0 0 0 0 0.5000 1.0000

程序分析:hot(8)函数产生 8×3 的矩阵,表示黑、红、黄、白的浓淡色,在此图略,大 家自己可以对比该图与前面图形的不同颜色。 2.色图的显示和处理 . (1) 色图的显示 可以利用 rgbplot 和 colorbar 命令显示色图。 rgbplot 命令 语法: 语法: rgbplot(map)

说明:map 是表 4.8 中的各预定义色图,rgbplot 命令可画出以行数为自变量红、绿、蓝 相对亮度分量的直线图,反映 R、G、B 三色比重的变化。 colorbar 命令 colorbar 命令以不同颜色来代表曲面的高度,显示一个水平或垂直的颜色标尺。 【例 4.17】用 rgbplot 和 colorbar 命令显示色图,如图 4.21 所示。 例
>> subplot(2,1,1) >> rgbplot(cool) >> subplot(2,1,2) >> peaks; >> colormap cool >> colorbar %画出冷色的颜色分量直线图

%产生冷色 peaks 函数曲面 %显示颜色标尺

图 4.21 用 rgbplot 和 colorbar 命令显示色图

程序分析: rgbplot 画出红、 蓝三色分量, 绿、 横坐标是 0~64 行, 纵坐标是 0~1; colorbar 则显示高度与颜色的对照长条标尺,曲面上每一个小方块的颜色就是根据此对照图而得出 的。 (2) 浓淡处理 shading 在前面的例子中, 每一个曲面都可以看作是由一块块的四方小片拼成, 而且每一小片表 面的颜色是均匀一致的, 其颜色值由小片所在的曲面高度决定。 如果要使小片表面的颜色产 生连续性的变化可使用 shading 命令,shading 命令的用法如表 4.9 所示。
表 4.9 命令 shading interp 功能 使小片根据四顶点的颜色产生连续的变化,或根据网线的线段两端产生连续 的变化,这种方式着色细腻但最费时。 shading flat shading faceted 小片或整段网线的颜色是一种颜色。 在 flat 着色的基础上,同时在小片交接的边勾画黑色,这种方式立体表现力 最强(默认方式)。 shading 命令的用法

mesh、surf 所创建的图形非数据点处的着色可由 shading 命令决定。 【例 4.18】使用浓淡处理 peaks 函数曲面图,如图 4.22 所示。 例
>> subplot(1,2,1) >> peaks; >> shading interp

>> subplot(1,2,2) >> peaks; >> shading faceted

图 4.22 用 interp 和 faceted 方式进行浓淡处理

(3) 亮度处理 brighten 可以用 brighten 命令来使色图变亮或变暗。 语法: 语法: brighten(a) 说明:当 0≤a≤1 时,色图加亮;当-1≤a<0,色图变暗。 【例 4.18 续】对 peaks 函数曲面加亮,并查看色图矩阵。 例
>> peaks; >> brighten(0.5) >> colormap ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2500 0 0.3536 …… 0.8292 0 0.7906 0 0.7500 0

0.7500 0.7906 0.8292 0.8660 0.9014 0.9354 0.9682 1.0000 1.0000 1.0000 0 0 0

程序分析:可以通过图形查看亮度处理后的变化。

4.3 MATLAB 的特殊图形绘制
MATLAB 提供了很多绘制特殊图形的命令,以适应不同的应用。

4.3.1 条形图
条形图常用于对统计的数据进行作图, 特别适用于少量且离散的数据。 绘制条形图的函 数如表 4.10 所示。
表 4.10 条形图函数 函数 bar barh 功能 垂直条形图 水平条形图 函数 bar3 bar3h 功能 三维垂直条形图 三维水平条形图

语法: 语法: bar(x,y,width,'参数 参数') %画条形图 参数 bar3(y,z,width,'参数 参数') %画三维条形图 参数 说明:x 是横坐标向量,省略时默认值是 1:m,m 为 y 的向量长度;y 是纵坐标,可以 是向量或矩阵,当是向量时每个元素对应一个竖条,当是 m×n 的矩阵时,将画出 m 组竖 条每组包含 n 条;width 是竖条的宽度,省略时默认宽度是 0.8,如果宽度大于 1,则条与条 之间将重叠;'参数'有 grouped(分组式)和 stacked(累加式),省略时默认为 grouped。bar3 命令 的格式也相同,y 必须是单调增加或减小,省略时为 1:m;'参数'除了 grouped 和 stacked 还 有 detached(分离式)。 bar 命令与 plot 命令一样,可以选择线型、颜色,并可以添加文字标识。 【例 4.19】用条形图表示某年一月份中 3 日~6 日连续四天的温度数据,y 矩阵的各列 例 分别表示平均温度、最高温度和最低温度,如图 4.23 所示,用条形图和三维条形图分别表 示。
>> x=3:6; >> y=[5.3000 13.0000 0.4000 5.1000 11.8000 -1.7000 3.7000 8.1000 0.6000 1.5000 7.7000 -4.5000] >> bar(x,y) %画条形图 >> bar3(x,y) %画三维条形图

图 4.23 (a) 条形图

(b) 三维条形图

程序分析:由上图看出条形图是按行分组的,每组为每天的平均温度、最高温度和最低 温度。

4.3.2 面积图和实心图
1. 面积图 面积图是在曲线与横轴之间填充颜色,用于绘制面积图的命令为“area”,只能用于二 维绘图。 语法: 语法: area(y) %画面积图 area(x,y) 说明:y 可以是向量或矩阵,如果 y 是向量则绘制的曲线和 plot 命令相同,只是曲线和 横轴之间填充颜色,如果 y 是矩阵则每列向量的数据构成面积叠加起来;x 是横坐标,当 x 省略时则横坐标为 1:size(y,1)。 2. 实心图 实心图是将数据的起点和终点连成多边形,并填充颜色,绘制实心图的命令为“fill”。 语法: 语法: fill(x,y,c) %画实心图 说明:c 为实心图的颜色,可以用'r'、'g'、'b'、 'c'、'm'、'y'、'w'、'k',或 RGB 三元组行 向量表示,也可以省略。 【例 4.19 续】绘制面积图和实心图,并比较其区别,如图 4.24 所示。 例
>> area(x,y) >> fill(x,y,'r') %面积图 %红色的实心图

图 4.24 (a) 面积图

(b) 实心图

程序分析:由上图可知面积图是绘制曲线和横轴间的面积,y 的各列叠加在一起的,而 实心图是将起点和终点连接并填充颜色的多边形。

4.3.3 直方图
用于建立直方图的命令为“hist”,直方图和条形图的形状相似,但直方图用于显示数 据的分布规律,并具有统计的功能。 语法: 语法: hist(y,m) %统计每段的元素个数并画出直方图 hist(y,x)

说明:m 是分段的个数,省略时则默认为 10;x 是向量,用于指定所分每个数据段的 中间值;y 可以是向量或矩阵,如果是矩阵则按列分段。 【例 4.20】用直方图表示正态分布的随机数分布,如图 4.25 所示。 例
>> y=randn(10,2) y= -1.1878 -1.1859 -2.2023 -1.0559 0.9863 1.4725 -0.5186 0.0557 0.3274 -1.2173 0.2341 -0.0412 0.0215 -1.1283 -1.0039 -1.3493 -0.9471 -0.2611 -0.3744 0.9535 >> x=-2:0.5:2; >> hist(y,x) %产生 10*2 的正态分布的随机数矩阵

图 4.25 直方图

程序分析:直方图显示的是 y 在 x 附近的元素的个数,如-2 附近有一个。产生的随机 数不同则得出的直方图也不同。

4.3.4 饼图
饼图是用于显示向量中的各元素占向量元素总和的百分比, 可以用 pie 和 pie3 命令分别 绘制二维和三维饼图。 语法: 语法: pie(x,explode,’label’) %画二维饼图 pie3(x,explode,’label’) %画三维饼图 说明:x 是向量;explode 是与 x 同长度的向量,用来决定是否从饼图中分离对应的一 部分块,非零元素表示该部分需要分离;’label’是用来标注饼图的字符串数组。 【例 4.21】绘制四个季度支出额的饼图,如图 4.26 所示。 例
>> y=[200 100 250 400]; %四个季度支出额 >> explode=[0 0 1 0]; >> pie(y,explode,{'第一季度 第二季度 第三季度 第四季度 第一季度','第二季度 第三季度','第四季度 第一季度 第二季度','第三季度 第四季度'})

图 4.26 饼图

4.3.5 离散数据图
MATLAB 提供了多个绘制离散数据的命令,有 stem、stem3、stairs 和 scatter 等。 stem 和 stem3 命令绘制的方法和 plot 命令相似, 但绘制出的是离散点的火柴杆图; stairs 命令用于绘制阶梯图;scatter 命令用于绘制点图,与 plot 命令相似但只有数据点。 【例 4.22】使用几种绘制离散数据的命令来显示 y = e ?2 x sin( x) 的离散数据,如图 4.27 例 所示。
>> x=0:0.1:2*pi; >> y=sin(x).*exp(-2*x); >> subplot(3,1,1) >> stem(x,y,'filled') >> subplot(3,1,2) >> stairs(x,y) >> subplot(3,1,3) >> scatter(x,y)

%画火柴杆图 %画阶梯图 %画点图

图 4.27 离散数据图

程序分析:'filled'参数是来填充火柴杆图的点标记。

4.3.6 对数坐标和极坐标图
MATLAB 还提供了一些特殊的坐标图形函数,如绘制对数坐标和极坐标图,可以方便 各种数学运算结果的显示和分析。 1. 对数坐标图形 对数坐标图形有 semilogx、semilogy 和 loglog 命令。 语法: 语法: semilogx(x,y,'参数 参数') %绘制 x 为对数坐标的曲线 参数 semilogy(x,y,'参数 参数') %绘制 y 为对数坐标的曲线 参数 loglog(x,y,'参数 参数') %绘制 x、y 都为对数坐标的曲线 参数 说明:参数和 plot 命令一样,只是坐标不同。 【例 4.23】求传递函数为 G (s) = 例 标为 w 按对数坐标。
>> w=logspace(-2,3,20); >> Aw=1./(w.*sqrt((0.5*w).^2+1)); >> Lw=20*log10(Aw); >> semilogx(w,Lw) >> title('对数幅频特性曲线 对数幅频特性曲线') 对数幅频特性曲线 %频率 w 为 0.01 到 1000 %计算幅频 %计算对数幅频

1 的对数幅频特性曲线,如图 4.28 所示,横坐 s(0.5s + 1)

图 4.28 对数频率特性

2. 极坐标图 极坐标图由 polar 命令来实现。 语法: 语法: polar(theta,radius,'参数 参数') %绘制极坐标图 参数 说明:theta 为相角,radius 为离原点的距离。 【例 4.23 续】用极坐标图表示上述传递函数的 Nyquist 曲线,如图 4.29 所示。 例
>> w=logspace(-2,3,20); >> Fw=-90-atan(0.5*w);

>> polar(Fw,Aw)

图 4.29 极坐标图

4.3.7 等高线图
在前面已经介绍了使用 meshc 和 surfc 命令可以绘制带有等高线的三维网线和曲面图, 另外还可以用 contour 和 contour3 命令直接绘制等高线。 语法: 语法: contour(Z,n) %绘制 Z 矩阵的等高线 contour(x,y,z,n) %绘制以 x 和 y 指定 x、y 坐标的等高线 说明:n 为等高线的条数,省略时为自动条数。 【例 4.24】绘制 peaks 函数的等高线,如图 4.30 所示。 例
>> [x,y,z]=peaks; >> contour(x,y,z) >> contour3(z,30) %画二维等高线 %画 30 条三维等高线

图 4.30 (a) 二维等高线

(b) 三维等高线

4.3.8 复向量图
compass 和 feather 命令都可以画复向量图。 1. compass 命令

compass 绘制的是以原点为起点的一组复向量,因此又称为罗盘图。 语法: 语法: compass(u,v) %画罗盘图 compass(Z) 说明:u、v 分别为复向量的实部和虚部;当只有一个参数 Z 时,则相当于 compass(real(Z),imag(Z))。 2. feather 命令 feather 绘制的是起点为(k,0)的复向量图,又称为羽毛图。 语法: 语法: feather(u,v) %画羽毛图 feather (Z) 【例 4.25】用罗盘图和羽毛图绘制复向量,如图 4.31 所示。 例
>> theta=0:0.2:2*pi; >> z=sin(theta).*exp(j*theta); >> compass(z) >> feather(z)

图 4.31 (a)罗盘图 罗盘图

(b)羽毛图 羽毛图

程序分析:羽毛图的绘制起点是(k,0),k 从 1~n,n 是 Z 向量的元素序号。

4.4 图形窗口的功能
前面的各种绘图命令执行时都打开图形窗口并绘制图形,生成的图形文件为“*.fig”文 件,在 MATLAB 命令窗口中可以通过选择菜单“File”——“New”——“Figure”或“File” ——“Open”来打开图形窗口。图形窗口不仅可以被动地显示图形,还可以用来对图形进 行编辑操作。 1.工具栏 . 从 MATLAB 的图形窗口带有工具栏,工具栏如图 4.32 所示。

添加文字 图形对象编辑

放大

缩小 三维图形旋转

添加直线 添加箭头 图 4.32 图形窗口的工具条

说明: 其中三维图形旋转是将图形窗口中的对象当作三维图形处理, 单击该按钮出现蓝 色框后,就可以用鼠标任意旋转图形,旋转时图形窗口的左下角显示当时的方位角 az 和俯 仰角 el。 2.菜单 . 图形窗口中的 Edit 和 Insert 菜单可以方便地编辑图形, 和 Insert 菜单如图 4.33 所示。 Edit

图 4.33 (a) Edit 菜单

(b) Insert 菜单

Edit 菜单: “Figure Properties…” Axes Properties…”“Current Object Properties…” 选择 、 “ 和 菜单项,可以打开相应的窗口来修改图形属性、坐标轴属性和对象属性。例如图 4.34 所示 的坐标轴属性窗口,可以方便地设置坐标轴尺寸、类型、文字标注、视角等。

图 4.34 坐标轴属性窗口

Insert 菜单:可以插入各种文字标注、箭头、坐标轴等。

4.5 对话框
对话框是用于计算机与用户进行交互的界面,几乎所有的 Windows 应用程序都需要借 助对话框来实现简单的人机交互, 即将用户的输入传递给计算机, 将计算机的提示信息反馈 给用户。 对话框带有提示信息和按钮等控件, MATLAB 中提供了多种创建专用对话框的命令。 在 1. 输入信息对话框 输入对话框为用户的输入信息提供了界面,使用 inputdlg 命令创建。输入对话框中有两 个按钮,分别为“Ok”和“Cancel”。 语法: 语法: answer = inputdlg(prompt,title,lineno,defans,addopts) %创建输入对话框 说明:answer 返回用户的输入,为元胞数组;prompt 为提示信息字符串,用引号括起 来,为元胞数组;title 为标题字符串,用引号括起来,可以省略;lineno 用于指定输入值的 行数,可以省略;defans 为输入项的默认值,用引号括起来,是元胞数组可以省略;addopts 指定对话框是否可以改变大小,取 on 或 off,省略时为 off 表示不能改变大小,为有模式对 话框(有模式对话框是指在对话框关闭之前,用户无法进行其它程序的运行),如果为 on 则 可以改变大小,自动变为无模式对话框。 【例 4.26】利用输入对话框输入二阶系统的系数,如图 4.35 所示。 例
>> prompt={'请输入阻尼系数 请输入无阻尼振荡频率 请输入阻尼系数','请输入无阻尼振荡频率 请输入阻尼系数 请输入无阻尼振荡频率'}; >> defans={'0.707','1'}; >> p=inputdlg(prompt,'输入参数 输入参数',1,defans) 输入参数

图 4.35 输入对话框

程序分析:prompt、defans 和 p 都是元胞数组。如果单击“Cancel”按钮,则返回空的 元胞数组。 2. 输出信息对话框 MATLAB 提供了几种专用的对话框,用于显示不同的输出信息。 (1) 消息框 msgbox 消息框是用来显示输出信息,有一个“Ok”按钮。 语法: 语法: msgbox(message,title,icon,icondata,iconcmap,CreateMode) %创建消息框 说明:message 为显示的信息,可以是字符串或数组;title 为标题,是字符串可省略; icon 为显示的图标,可取值为“none”(无图标)、“error”(出错图标)、“help”(帮助图标)、 “warn”(警告图标)或“custom”(自定义图标),也可省略;当使用“custom”时,用 icondata

定义图标的数据,用 iconcmap 定义图标的颜色映象;CreateMode 为对话框的产生模式可省 略,取值为“modal”(有模式)、“replace”(无模式可代替同名的对话框)、“non-modal”(默 认为无模式)。 【例 4.26 续】使用消息框显示当阻尼系数大于 1 时的警告信息,如图 4.36 所示。 例
>> msgbox('阻尼系数输入范围出错 警告 阻尼系数输入范围出错','警告 阻尼系数输入范围出错 警告','warn')

图 4.36 消息框

程序分析:消息框 msgbox 没有返回值。 (2) 警告对话框 warndlg 警告对话框是用来显示警告信息,有一个“Ok”按钮,创建的警告对话框与 msgbox 用 “warn”参数时相同。 语法: 语法: warndlg(WarnString,DlgName,CreateMode) %创建警告对话框 说明:WarnString 为显示的警告信息,是字符串;DlgName 为警告提示框的名称,可 省略;CreateMode 为对话框的产生模式与 msgbox 的设置相同,可省略。 【例 4.26 续】使用警告对话框显示当阻尼系数大于 1 时的警告信息。 例
>> warndlg('阻尼系数输入范围出错 警告 阻尼系数输入范围出错','警告 阻尼系数输入范围出错 警告')

程序分析:产生的对话框与图 4.36 一样。 (3) 错误提示对话框 errordlg 错误提示对话框是用来显示出错信息,有一个“Ok”按钮。 语法: 语法: errordlg(ErrorString,DlgName,CreateMode) %创建错误提示框 说明:ErrorString 为显示的出错信息,是字符串;DlgName 为错误提示框的名称,可省 略;CreateMode 为对话框的产生模式与 msgbox 的设置相同,可省略。 【例 4.26 续】使用出错提示框显示当阻尼系数小于 0 时出错信息,如图 4.37 所示。 例
>> errordlg('阻尼系数输入出错 出错 阻尼系数输入出错','出错 阻尼系数输入出错 出错')

图 4.37 出错提示框

(4) 帮助对话框 helpdlg 帮助对话框是用来显示帮助信息,有一个“Ok”按钮。 语法: 语法: helpdlg(HelpString,DlgName)

%创建帮助对话框

说明:HelpString 为显示的帮助信息,是字符串;DlgName 为帮助提示框的名称,可省 略。 【例 4.26 续】使用帮助提示框显示阻尼系数的范围,如图 4.38 所示。 例
>> helpdlg('欠阻尼系数应大于 0 小于 1','帮助 帮助') 欠阻尼系数应大于 帮助

图 4.38 帮助提示框

(5) 提问对话框 questdlg 提问对话框是用来进行提问,用户通过按钮回答,可以有一个或多个按钮。 语法: 语法: Button=questdlg(Question,Title,Btn1,Btn2,Btn3,DEFAULT) %创建提问对话框 说明: Button 为返回的用户所按下的按钮名称; Question 为提出的问题, 是字符串; Title 为对话框的标题,可省略;DEFAULT 为指定当按下回车键时的默认按钮,可省略;Btn1、 Btn2 和 Btn3 为按钮的显示标注,可以有两个或三个按钮,当全部省略时则默认为“Yes”、 “No”和“Cancel”三个按钮。 【例 4.26 续】 例 使用提问提示框使用户确认, 如图 4.39 所示。
>> button=questdlg('是否确认?','Are you sure?','Yes','No','Yes') 是否确认? 是否确认 button = No

程序分析:有两个按钮,默认的指定按钮为“Yes”,即当 用户按下回车键时,返回“Yes”,当用户单击按钮“No”时, 返回“No”。

图 4.39 提问提示框

3. 文件管理对话框 在对文件操作时,经常要对文件进行打开、保存等操作,在各种应用软件中都可以通过 “File”菜单中的“Open”和“Save”命令打开相应的对话框,进行文件管理,MATLAB 也提供了标准的对话框进行文件的操作。 (1) 打开文件对话框 uigetfile uigetfile 命令提供了打开文件对话框,可以选择文件类型和路径。 语法: 语法: [FileName, PathName] = uigetfile(FiltrEspec, Title,x,y) 说明:FileName 和 PathName 分别为返回的文件名和路径,可省略,如果按“取消”按 钮或发生错误,都返回 0;FiltrEspec 指定初始时显示的文件名,可以用通配符“*”表示, 当省略时,则自动列出当前路径下的所有“*.m”文件和目录;Title 为对话框标题,可省略; x、y 分别指定对话框在屏幕上的位置(到屏幕左上角的距离),单位是像素,可省略。 【例 4.27】利用打开文件对话框选择 MATLAB 目录下的文件 license.txt,如图 4.40 所 例 示。
>> [fname,pname]=uigetfile('*.*','打开文件 打开文件',100,100) 打开文件 fname = license.txt

pname = D:\MATLAB6p1\

图 4.40 打开文件对话框

程序分析:在屏幕的(100,100)位置显示打开文件对话框,单击“打开”按钮,返回文 件名和路径名到 fname 和 pname 变量。 实际上, 在打开文件对话框选择了文件名并按 “打开” 按钮后, 并没有真正地打开文件, 只是得出了文件和路径名, 如果要打开文件则还应使用第八章介绍的文件输入输出命令来实 现。 (2) 保存文件对话框 uiputfile uiputfile 命令提供了保存文件对话框,用来选择文件类型和路径。 语法: 语法: [FileName, PathName] = uiputfile(FiltrEspec, Title,x,y) 说明:参数定义与 uigetfile 相同。 【例 4.27 续】利用保存文件对话框来选择文件。 例
>> [fname1,pname1]=uiputfile('Ex0431.mat','保存文件 保存文件') 保存文件

运行该命令则会出现保存文件对话框, 如果要保存文件则在该语句后, 添加第八章介绍 的文件输入输出命令来实现。

4.6 句柄图形
4.6.1 句柄图形体系
MATLAB 从 4.0 版开始就引入了句柄图形的概念,句柄图形的概念很简单,就是将一 个图形的每一个组件都看成一个对象,每个对象都有一个独一无二的句柄(Handle),句柄是 存取图形对象的唯一识别,不同对象的句柄不能重复。 句柄图形是一种面向对象的绘图系统, 又称为低层图形, 低层命令能直接操作基本绘图 要素,例如线、文字、面和图形控件等基本绘图要素,能够更细致更个性地表现图形,但低 层命令使用起来较难,不象高层命令那样简明易懂。

句柄图形体系由若干个图形对象组成,如图 4.41 所示。
Root(屏幕)

Figure(图)

Uicontrol(界面控件)

Axes(轴)

Uimenu(界面菜单)

Line (线条)

Surface (表面)

Rectangle (矩形)

Patch (贴片)

Image (图像)

Text (文字)

Light (光源)

图 4.41 句柄图形体系

在上图中对象按父对象和子对象组成层次结构。每个计算机的根对象只有一个即屏幕, 是其他对象的父对象,它的句柄总是为 0;Figure(图)的句柄总是正整数,用来标识图形窗口 的序号,一般在图形窗口标题栏中的“Figure No.”之后的数值就是该图形窗口的句柄;其 余对象的句柄都是双精度型浮点数。

4.6.2 图形对象的操作
1.图形对象的创建 . 每次创建一个对象时,就为它建立一个唯一的句柄。除了根屏幕外,所有的图形对象都 由与之同名的命令创建,每个命令的格式及功能如表 4.11 所示。
表 4.11 创建图形对象的命令 命令 h_ figure =figure(n) 功能 创建第 n 个图形 窗口 h_axes =axes(‘position’,[left,bottom,width,height]) h_ line =line(x,y,z) h_ surface=surface(x,y,z,c) 创建坐标轴 创建直线 创建面 定义轴的位置和大小 z 省略则在二维平面上 x、y、z 定义三维曲面,c 是颜 色参数 h_ rectangle= rectangle (‘position’,[x,y,w,h],’curvature’,[xc,yc]) 创建贴片 创建矩形 x、y 为左下顶点坐标,w、h 为长方形的宽和高,xc、yc 为 曲率 h_ patch=patch(‘faces’,fac,’veitices’,vert) fac 为多边形顶点的序号矩阵, vert 为顶点矩阵 h_ image=image(x) h_ text=text(x,y,’string’) 创建图像 创建文字 x 为图像数据矩阵 x、y 为字符串 string 的标注位 置 h_ light=light(‘PropertyName’,Propertyvalue) 创建光源 设置光的入射方向 说明 n 为正整数

h_ uicontrol =uicontrol(‘PropertyName’,Propertyvalue)

创建用户界面 控件

PropertyName 和 Propertyvalue 指定控件的类型 propertyName 和 Propertyvalue 指定菜单的形式

h_uimenu = uimenu (‘propertyName’, Propertyvalue)

创建用户界面 菜单

上表的每个命令在创建对象的同时,等式的左边为该对象的句柄。当创建子对象时,如 果父对象不存在,则 MATLAB 会自动创建父对象,并将子对象置于父对象中,例如当创建 “axes”时,会自动创建图形窗口“Figure”。 在创建图形对象时,为了提高可读性,在给对象句柄取名时应统一使用“h_对象名”, 例如创建坐标轴对象取名为“h_axes”。 2.对象句柄的获取 . (1) 当前对象句柄的获取 MATLAB 提供了三个获取当前对象句柄的命令,分别是 gcf、gca、gco。 语法: 语法: gcf %获取当前图形窗口句柄 gca %获取当前坐标轴句柄 gco %获取被鼠标最近点击对象的句柄 【例 4.28】使用命令获取图形对象的句柄,如图 4.42 所示。 例
>> x=0:0.1:2*pi; >> y=sin(x).*exp(-x); >> plot(x,y) >> text(pi,0,'\leftarrowexp(-x)*sin(x)=0') >> h_fig=gcf %获取图形窗口的句柄 h_fig = 1 >> h_axes=gca %获取坐标轴的句柄 h_axes = 100.0013 >> h_obj=gco %获取最近点击对象的句柄 h_obj = 3.0017

图 4.42 图形对象

程序分析:用 plot(x,y)画线,因为没有图形窗口所以自动产生图形窗口;图形窗口句柄 为 1;坐标轴句柄为 100.0013;鼠标最近点击的对象是曲线句柄为 3.0017。

(2) 查找对象 用命令 findobj 可以快速查找所有对象,以及获取指定属性值的对象句柄。 语法: 语法: h=findobj %返回根对象和所有子对象的句柄 h=findobj(h_obj) %返回指定对象的句柄 h=findobj(‘PropertyName’,PropertyValue) %返回符合指定属性值的对象句柄 h=findobj(h_obj, ‘PropertyName’, PropertyValue) %在指定对象及子对象中查找符合指定属性值的对象句柄 说明:h_obj 为指定对象句柄;PropertyName 为属性名;PropertyValue 为属性值。 【例 4.28 续】使用 findobj 命令获取图 4.42 中图形对象的句柄。 例
>> findobj ans = %返回根对象和所有子对象的句柄

0 1.0000 100.0013 101.0038 3.0017 >> h_text=findobj(h_fig,'string','\leftarrowexp(-x)*sin(x)=0') %查找符合属性值的文字对象句柄 h_text = 101.0038

程序分析:根对象句柄为 0;其子对象图形窗口句柄为 1;图形窗口子对象坐标轴句柄 为 100.0013;坐标轴子对象文字句柄为 101.0038;坐标轴子对象曲线句柄为 3.0017;文字对 象的文字属性名为 string。 (3) 追溯父对象和子对象的句柄 如果一个对象的句柄已知,则可以追溯到其父对象和子对象的句柄。 语法: 语法: h_parent=get(h_obj,’parent’) %追溯父对象的句柄 h_children=get(h_obj,’children’) %追溯子对象的句柄 【例 4.28 续】追溯坐标轴对象的父对象和子对象。 例
>> h_ children=get(h_axes,'children') h_ children = 101.0038 3.0017 >> h_parent=get(h_axes,'parent') h_parent = 1 %子对象为文字对象和曲线对象

%父对象为图形窗口对象

3.对象句柄的删除 . 在获取了图形对象的句柄后,就可以对图形对象进行操作。 删除图形对象使用命令 delete(h_obj),该命令将删除句柄所指对象和所有子对象,而且 不提示确认,使用时要小心。 【例 4.28 续】删除坐标轴。 例
>> delete(h_axes)

4.6.3 图形对象属性的获取和设置
所有的图形对象都有属性(property),通过设置属性来定义或修改对象的特征。每个不 同的对象都有和它相关的属性, 对象属性包括对象的位置、 颜色、 类型、 父对象和子对象等。 对象属性由属性名和相应属性值组成,属性名是字符串,一般第一个字母大写,没有空 格。 为了方便 MATLAB 对属性名的使用不区分大小写, 只要不产生歧义甚至可以不必写全, 例如坐标轴对象的位置属性用“Position”、“position”和“pos”属性名都可以。 1.创建对象时设置属性 . 对象的属性可以在创建时设置,在创建时句柄图形对象可以设置多个属性。 【例 4.29】创建图形对象。 例
>> h_fig=figure('color','red','menubar','none','position',[0,0,300,300]) h_fig = 1

或者使用结构数组创建图形对象:
>> ps.color='red'; >> ps.position=[0,0,300,300]; >> ps.menubar='none'; >> h_fig=figure(ps) h_fig = 1

程序分析:创建一个窗口,背景为红色,没有菜单条,在屏幕的(0,0)位置,宽度、高度 为 300。 2. 用 get 函数获取属性值 get 函数用于获取指定对象的属性值。 语法: 语法: get(h_obj) %获取句柄对象所有属性的当前值 get(h_obj, 'PropertyName') %获取句柄对象指定属性的当前值 【例 4.29 续】获取图形对象属性。 例
>> p=get(h_fig,'position') p= 0 0 300 300 >> c=get(h_fig,'color') c= 1 0 0

程序分析:图形对象的颜色为红色,用 RGB 三元组表示。 3. 用 set 函数设置属性值 set 函数用来设置对象的属性值。 语法: 语法: set(h_obj) %显示句柄对象所有属性和属性值 set(h_obj, 'PropertyName') %显示句柄对象指定属性名的属性值 set(h_obj, 'PropertyName', ' PropertyValue ') %设置句柄对象指定属性的属性值

set(h_obj, 'PropertyStructure')

%用结构数组设置句柄对象指定属性的属性值

【例 4.30】使用低层命令画图,并设置各对象的属性,如图 4.43 所示。 例
>> h_fig=figure('color','red','menubar','none','position',[0,0,300,300]); >> x=0:0.1:2*pi; >> y=sin(x).*exp(-x); >> h_line1=plot(x,y,'b'); >> title('y=exp(-x)*sin(x)') >> set(gca,'ygrid','on') %显示 y 网格 >>line1width=get(h_line1,'linewidth') %获取曲线宽度 line1width = 0.5000 >> set(h_line1,'linewidth',3) %设置曲线宽度 >> h_title =get(gca,'title') %获取标题句柄 h_title = 3.0028 >> titlefontsize=get(h_title_fontsize,'fontsize') %获取字体大小 titlefontsize = 10 >> set(h_title_fontsize,'fontsize',13) %设置标题字体大小 >> h_text1=text(pi,0,'\downarrow'); %画向下箭头 >> text1pos=get(h_text1,'position') %获取文字位置 text1pos = 3.1416 0 0 >> h_text2=text(text1pos(1,1),text1pos(1,2)+0.025,'exp(-x)*sin(x)=0'); %设置文字位置 >> set(h_text1,'fontsize',13,'color','red') %设置字体大小、颜色 >> set(h_text2,'fontsize',13,'color','red')

图 4.43 图形对象

4.对象属性的默认设置和获取 . 对象属性的默认值也可以设置和获取。 语法: 语法: get(h_obj, 'DefaultObjectTypePropertyName') %获取对象属性的默认值 set(h_obj, 'DefaultObjectTypePropertyName', PropertyValue) %设置属性的用户定义默认值 set(h_obj, 'DefaultObjectTypePropertyName', 'Remove')

%删除属性的用户定义默认值 说明:DefaultObjectTypePropertyName 的表示为“Default+对象名+属性名”,例如线对 象的线条宽度为“DefaultLineLineWidth”。

4.7 图形用户界面(GUI)设计
现在制作的软件人机交互越来越方便和智能化, 都是借助图形用户界面来实现的。 图形 用户界面(Graphical User Interface,简称 GUI)就是通过窗口、菜单、按钮、文字说明等对象 构成一个美观的界面,提供用户利用鼠标或键盘方便地实现操作。MATLAB 提供的 Demo 演示程序就是图形界面很好的范例。 MATLAB 设计图形用户界面的方法有两种:使用可视化的界面环境和通过编写程序, 下面主要介绍使用可视化的界面环境来设计图形用户界面。

4.7.1 可视化的界面环境
MATLAB 提供了可视化的界面环境 Guide,其功能与微软的软件如 VB 等很相似,可 以很方便地创建界面。 打开可视化界面环境的方法有以下几种: (1) 选择菜单“File”——“ New”——“GUI”命令; (2) 在命令窗口输入“Guide”命令或输入“Guide Filename”就会出现 Guide 快速开始 界面。如图 4.44 所示。

图 4.44 Guide 快速开始界面

在 Guide 快速开始界面中有“Create New GUI”和“Open Existing GUI”两个选项卡, 如果要创建空白的可视化图形文件则选择“Blank GUI(Default)”,然后单击“OK”按钮, 就会出现空白的可视化界面窗口,如图 4.45 所示。如果需要创建具有控件或坐标轴、菜单 等的界面,可以单击图 4.44“Blank GUI(Default)”下面的“GUI with Uicontrols”等选项。

对象对 齐工具

菜单 编辑器

属性 编辑器 激活 图形

图形对 象面板 对象 浏览器 界面编 辑面板

图 4.45 可视化界面环境

可视化界面环境如图在工具栏主要提供了四个工具:对象对齐工具(Align Objects)、菜 单编辑器(Menu Editor)、属性编辑器(Property Inspector)和对象浏览器(Object Browser),单击 这四个按钮就会出现相应的窗口。 在可视化的界面环境的左边是图形对象面板, 有各种控件 可以通过拖放到空白的界面编辑面板来创建新控件。

4.7.2 创建菜单
在 Windows 的环境中几乎所有的应用程序都有自己的菜单系统,菜单可以方便用户的 操作,几乎是必不可少的工具。 1. 菜单编辑器 在可视化界面环境选择菜单 “Tools” “Menu Editor…” —— 或单击工具栏 “Menu Editor” 按钮,就会出现菜单编辑器窗口,如图 4.46 所示。

图 4.46 菜单编辑器

在菜单编辑器中图标 右移; 和

是新建菜单,

是新建子菜单;



用来将菜单向左移和

是将菜单项上移和下移;

是删除菜单项。“Label”栏用来填写菜单项的名

称,如果在前面加“&”符号则加快捷键,当运行时第一个字母会加下划线,以方便用户快 速激活菜单项;“Tag”是标记;“Separator above the item”是分隔符;“Item is checked” 是初值是否已选;“Callback”栏用于输入回调函数。 【例 4.31】使用菜单编辑器创建菜单。 例 在菜单编辑器创建菜单,如图 4.47 所示,如果是直接在可视化的界面环境中新建图形 窗口, 则从头开始新建菜单, 如图 4.47(a); 如果在已存在的图形窗口中创建菜单, MATLAB 则 图形窗口默认有七个标准菜单,新建的菜单从最右边添加,如图 4.47(b)。

图 4.47 (a)在新窗口创建菜单 在新窗口创建菜单

(b)在已建的窗口创建菜单 在已建的窗口创建菜单

在图 4.47(a)中创建了两个菜单 “File” “Paint” 在图 4.47(b)中创建了一个菜单 和 , “Paint” , 并具有两级下拉子菜单,“Circle”和“Color”为第一级下拉菜单,“Red”和“Blue”为 第二级。 2. 编程创建菜单 在 4.6 节中介绍过句柄图形对象体系,其中界面菜单用 unimenu 命令创建。 语法: 语法: h_menu=uimenu(h_Parent,’PropertyName’,ProperValue,…) 说明:h_Parent 为菜单所在父对象的句柄。 【例 4.31 续】编程创建如上图 4.47(b)所示的菜单。 例
>> h_fig=gcf h_fig = 1 >> h_menu=uimenu(h_fig,'label','Paint'); >> h_menu1=uimenu(h_menu,'label','Circle'); >> h_menu2=uimenu(h_menu,'label','Color'); >> h_menu21=uimenu(h_menu2,'label','Red'); >> h_menu22=uimenu(h_menu2,'label','Blue');

%创建菜单 Paint %创建 Paint 的子菜单 Circle %创建 Paint 的子菜单 Color %创建 Color 的子菜单 Red %创建 Color 的子菜单 Blue

程序分析:label 属性用来命名菜单项名称,和图 4.46 的菜单编辑器中的 label 栏一致。 3. 回调函数

回调函数是字符串,可以包含任何 MATLAB 的合法命令和 M 文件名,回调的作用是 将字符串用“eval”执行,以实现菜单的功能。 【例 4.31 续】将已创建的菜单修改,并添加回调函数。 例
>> h_menu21=uimenu(h_menu2,'label','Red','callback','set(h_fig,''color'',''red'')') %创建 Color 的子菜单 Red 将图形背景为红色 >> h_menu22=uimenu(h_menu2,'label','Blue','callback','set(h_fig,''color'',''blue'')') %创建 Color 的子菜单 Blue 将图形背景为蓝色

4.7.3 控件的使用
除了菜单外,控件也是很重要的界面组成部分,在图 4.45 的图形对象面板中有各种控 件,包括按钮、切换按钮、单选按钮、复选框、文本框、静态文本框、滚动条、框架、列表 框、弹出式菜单和坐标轴。 1. 常用控件 常用控件的作用如表 4.12 所示。
表 4.12 控件的功能 控件名 按钮 PropertyName PushButton 功能 最常用的控件,用于响应用户的鼠标单击,按钮上有说明文字说 明其作用。 切换按钮 单选按钮 ToggleButton RadioButton 当单击时会凹凸状态切换。 当单击时会用黑白点切换,总是成组出现,多个单选按钮互斥, 一组中只有一个被选中。 复选框 CheckBox 当单击时会用√切换,有选中、不选中和不确定等状态,总是成 组出现,多个复选框可同时选用。 文本框 静态文本框 滚动条 EditText StaticText Slider 凹形方框,可随意输入和编辑单行和多行文字,并显示出来。 用于显示文字信息,但不接受输入。 可以用图示的方式显示在一个范围内数值的大概值范围,用户可 以移动滚动条改变数值。 框架 列表框 弹出式菜单 坐标轴 Frame ListBox PopupMenu Axes 将一组控件围在框架中,用于装饰界面。 显示下拉文字列表,用户可以从列表中选择一项和多项。 相当于文本框和列表框的组合,用户可以从下拉列表中选择。 用于绘制坐标轴。

2. 控件的创建 控件的创建可以在可视化界面环境中创建, 也可以使用 MATLAB 命令用创建句柄对象 的方法来创建。 (1) 在可视化界面环境中创建控件 在可视化界面环境中创建控件很简单, 就是在图形对象面板中选中控件, 然后在空白的 界面编辑面板中拖放即可,如图 4.48 所示为各种控件的显示。

图 4.48 可视化的界面环境

(2) 用 unicontrol 命令创建控件 语法: 语法: h_control=uicontrol(h_Parent,’PropertyName’,ProperValue,…) 3. 控件的常用属性 创建控件以后,需要对控件的各种属性进行设置,大部分控件都具有以下属性: (1) string 属性:用于显示在控件上的字符串,起说明或提示作用。 (2) callback 属性:回调函数,和菜单的一样。 (3) enable 属性:表示该控件是否有效,如果“on”则表示有效,如果“off”则表示无 效。 (4) tooltipstring 属性:当鼠标放在控件上时显示提示信息,为字符串。 (5) 字体属性:包括 fontname、fontsize 等。 (6) interruptible 属性:指定当前回调函数在执行时是否允许中断,去执行其它函数。

4.7.4 对象对齐工具、属性编辑器和对象浏览器 对象对齐工具、
在可视化界面环境中较重要的还有对象对齐工具、 属性编辑器和对象浏览器。 前面已介 绍在工具栏可以通过按钮分别打开,也可以选择菜单“Tools”——“Align Objects…”打开 对象对齐工具,如图 4.49(a)所示,对象对齐工具是用来将用户界面的多个控件对齐;选择 菜单“View”——“Object Browser”可以打开对象浏览器,查看图 4.48 中的所有对象,如 图 4.49(b)所示。

图 4.49 (a)对象对齐工具 对象对齐工具

(b) 对象浏览器

属性编辑器可以通过选择菜单“View”——“Property Inspector”打开,当选择按钮 (PushButton)时,打开属性编辑器如图 4.50 所示,在属性编辑器中可以设置和查看各属性。

图 4.50 属性编辑器

4.7.5 回调函数
实现 GUI 的基本机制是对控件的 Callback 属性编程, 如下图 4.51 所示创建了一个按钮, 则选择按钮后, 然后选择菜单 “View” —— “Object Callbacks” 就会出现 “ButtonDownFcn” 、 “Callback”、“CreateFcn”和“DeleteFcn”子菜单项,除了“Callback”之外,其它三个 菜单项也都是用来编写回调函数的。

图 4.51 回调函数菜单项

ButtonDownFcn:当鼠标左键单击控件时执行; Callback:与控件相关的标准回调函数,实现的功能因控件的不同而不同; CreateFcn:当创建对象时执行; DeleteFcn:当删除对象之前执行。 当选择各菜单项时, 就会打开 M 文件编辑器/调试器窗口, 出现具有如下函数名的程序:
% -------------------------------------------------------------------function varargout = pushbutton1_ButtonDownFcn(h, eventdata, handles, varargin) % -------------------------------------------------------------------function varargout = pushbutton1_CreateFcn(h, eventdata, handles, varargin) % -------------------------------------------------------------------function varargout = pushbutton1_DeleteFcn(h, eventdata, handles, varargin) % -------------------------------------------------------------------function varargout = pushbutton1_Callback(h, eventdata, handles, varargin)

在各函数中编写程序代码,完成各回调函数的功能。

4.7.6 GUI 应用举例
【例 4.32】使用控件设计用户界面,根据阻尼系数绘制二阶系统的时域曲线。 例 功能:在图形用户界面中,通过弹出式菜单选择二阶系统的阻尼系数,然后单击不同按 钮在坐标轴中绘制不同阻尼系数不同颜色的时域曲线。 1. 设计界面

使用“guide”命令打开 Guide 快速开始界面,选择“Blank GUI”出现空白的可视化界 面环境窗口,调整图形大小,将界面窗口右边的图形对象面板中的控件拖放到空白窗口中。 放置以下控件:一个坐标轴、两个静态文本框、一个弹出式菜单、两个按钮;然后打开 对象对齐工具对齐各控件,界面布局如图 4.52 所示。

图 4.52 界面布局

2. 设置控件属性 各控件属性设置如表 4.13 所示。
表 4.13 各控件属性设置表 控件类型 静态文本框 静态文本框 按钮 属性名 String(显示文字) String(显示文字) String(显示文字) Tag(标记) 按钮 String(显示文字) Tag(标记) 弹出式菜单 String(显示文字) 属性值 二阶系统时域曲线 输入阻尼系数: 红色曲线 pushbutton_red 蓝色曲线 pushbutton_blue 0 0.3 0.5 0.707 Tag(标记) 坐标轴 XLim(x 轴范围) YLim(y 轴范围) popupmenu_zeta [0 20] [0 1.5]

单击工具栏的激活图形图标,或选择菜单“Tools”——“Activate Figure”命令,可以 查看到运行的用户界面。 3. 回调函数 实现回调是最关键的,本例要完成当选择弹出式菜单的阻尼系数后,然后单击“红色曲 线”则在坐标轴中画出相应阻尼系数的二阶系统红色时域曲线,如果单击“蓝色曲线”则画 出蓝色曲线。

在设计界面中选定需要编写回调函数的按钮,然后选择菜单“View”——“Object Callbacks”——“Callback”,可以看到三个空白的 function,名字以控件的“Tag”属性取 名,分别是“popupmenu_zeta”、 “pushbutton_red”和“pushbutton_blue”,则出现相应的.m 文件如下:
% -------------------------------------------------------------------function varargout = pushbutton_red_Callback(h, eventdata, handles, varargin) % -------------------------------------------------------------------function varargout = pushbutton_blue_Callback(h, eventdata, handles, varargin) % -------------------------------------------------------------------function varargout = popupmenu_zeta_Callback(h, eventdata, handles, varargin)

弹出式菜单的回调函数程序如下:
% -------------------------------------------------------------------function varargout = popupmenu_zeta_Callback(h, eventdata, handles, varargin) val=get(h,'value') switch val case 1 handles.data=0 case 2 handles.data=0.3 case 3 handles.data=0.5 case 4 handles.data=0.707 end guidata(h,handles)

程序分析:h 为弹出式菜单的句柄,'Value'属性是弹出式菜单的所选值,根据用户在弹 出式菜单的选择,确定阻尼系数;使用了 switch 结构,在下章中介绍,是用来作分支选择 的;handles 变量非常重要,它是一个结构数组,包括两部分内容: (1) 存储所有在图形界面中的控件、菜单、坐标轴对象的句柄,每个对象的句柄名称以 对象的“Tag”名相同。 (2) 用于在 function 之间传递数据, 先给 handles 结构数组建立一个域, 然后调用 guidata 函数产生新的 handles 结构,并存储数据,以备其它 function 使用。 按钮的回调函数如下:
% -------------------------------------------------------------------function varargout = pushbutton_red_Callback(h, eventdata, handles, varargin) x=0:0.1:20; zeta=handles.data y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); plot(x,y,'r') % -------------------------------------------------------------------function varargout = pushbutton_blue_Callback(h, eventdata, handles, varargin) x=0:0.1:20; zeta=handles.data y=1-1/sqrt(1-zeta^2)*exp(-zeta*x).*sin(sqrt(1-zeta^2)*x+acos(zeta)); plot(x,y,'b')

程序分析:两个按钮是用来画曲线的,zeta 变量存放阻尼系数,是从 handles 结构数组 的 data 域获取的。 运行界面如图 4.53 所示。

图 4.53 运行界面

保存的文件为 Ex0432.fig 图形文件,并自动产生 Ex0432.m 文件,打开该 M 文件,可以 看到使用低层命令创建图形的程序,运行该 M 文件也可以运行显示该图形界面。

4.8 动画
动画与静态的图形相比显示的效果更让人激动, MATLAB 使科学运算与动画自然结合, 实现完美的效果。MATLAB 也有很多动画的应用程序,如 travel、truss、lorenz 等。 MATLAB 产生动画的方式有两种: (1) 影片方式 这种方式是以图像的方式预存多个画面, 再将这些画面逐帧播放, 就可以得到动画的效 果。 这种方式类似于电影的原理, 可以制作精美的图像, 而播放速度快不会有不连贯的感觉, 但是其缺点是每个画面都必须事先准备, 无法进行实时成像, 而且每个画面的存储需要占用 相当大的内存空间。 (2) 对象方式 这种方式保持图形窗口中大部分对象即整个背景不变, 而只更新部分运动的对象, 以便 加快整幅图像的实时生成速度。使用对象方式所产生的动画,可以实现实时的变化,也不需 要太高的内存需求,但其缺点是无法产生太复杂的动画。

4.8.1 以电影方式产生动画
以电影方式产生动画,有两个步骤: (1) 使用 getframe 命令来抓取图形作为画面,每个画面都是以一个列向量的方式,置于 存放整个电影的矩阵 M 中。 (2) 使用 movie(M,k)命令来播放电影,并可指定矩阵 M 播放的重复次数 k。 在 MATLAB6.x 版之前,还需要使用 moviein 命令来预留内存空间。 【例 4.33】使用电影方式制作动画,显示二阶系统的时域波形,最后一个画面如图 4.54 例

所示。
>> n=20; >> for i=1:n x=0:0.1:i; y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)); plot(x,y) axis([0,20,0,1.5]); %固定坐标轴 M(i)=getframe; %抓取画面 end >> movie(M,3) %播放 3 次

程序分析:使用 for 循环,画 20 个不同阶段的波形画面,将画面抓取保存到 M 矩阵中, 播放 3 次。

图 4.54 最后一帧画面

4.8.2 以对象方式产生动画
以对象方式产生动画,使用 MATLAB 句柄图形的概念,所有的曲线或曲面均可被视为 —个对象, 对其中的每个对象都可以通过属性设置进行修改。 以对象方式产生动画就是擦除 旧对象,产生相似但不同的新对象,这样既不破坏背景又可以看到动画的效果。这种方式技 巧性较高,不需要大量的内存,而且可以产生实时的动画。 产生移动的动画效果需要先计算对象的新位置, 并在新位置上显示出对象; 然后擦除原 位置上的旧对象,并刷新屏幕。 1.擦除属性 EraseMode . 以对象方式产生动画需要设置 EraseMode 属性,EraseMode 为一个字符串,代表对象的 擦除方式,即对于旧对象的处理方式。EraseMode 属性有以下几种: normal:计算整个画面的数据,重画整个图形。 xor:将旧对象的点以 xor 的方式还原,即只画与屏幕色不一致的新对象点,擦除不 一致的原对象点,这种方式不会擦除被擦对象下面的其他图像。 background:将旧对象的点变成背景颜色,实现擦除,这种方式会擦除被擦对象下面 的其他图像。 none:保留旧对象的点,不做任何擦除。 在上述四种 EraseMode 中,耗费时间的次序是: normal > xor > background > none

xor 和 background 很接近,但是 background 方式会擦去旧对象扫过的其他对象,如坐 标轴、网格线、另一条曲线等,因此较少用到,一般在产生动画时,最常将 EraseMode 属 性设置为 xor 方式。 2.对象的位置属性 . 通常在动画过程中,会改变对象的位置或尺寸、颜色等外观属性,位置属性有: xdata:为一个向量,代表对象的 x 坐标值。 ydata:为一个向量,代表对象的 y 坐标值。 3.屏幕刷新 . 当新对象的属性设置后,应刷新屏幕,使新对象显示出来,刷新屏幕用 drawnow 命令 实现。drawnow 命令使 MATLAB 暂停当前的任务序列而去刷新屏幕,如果没有 drawnow 命 令,MATLAB 会等当前的任务序列执行完才去刷新屏幕。 4.产生动画 . 产生动画的具体步骤是: (1) 先产生一个对象,其 EraseMode 属性为 xor、background 或 none; (2) 在循环中产生动画,每次循环改变此对象的 xdata 或 ydata(或两者); (3) 使用 drawnow 命令刷新屏幕 【例 4.34】使用对象方式产生用一个红色的小球沿着曲线运动的动画,如图 4.55 所示。 例

图 4.55 运行界面 >> x=0:0.1:20; >> y=1-1/sqrt(1-0.3^2)*exp(-0.3*x).*sin(sqrt(1-0.3^2)*x+acos(0.3)); >> plot(x,y) >> h=line(0,0,'color','red','marker','.','markersize',40,'erasemode','xor'); >> for i=1:length(x) set(h,'xdata',x(i),'ydata',y(i)); pause(0.005) drawnow end

%定义红色的小球 %设置小球的新位置 %暂停 0.005 秒 %刷新屏幕

程序分析:小球以 xor 的方式擦除旧曲线,如果将 EraseMode 改成 background 方式, 则会发现小球会擦掉原来的曲线;drawnow 命令的作用是使 MATLAB 立刻处理 set 命令, 但由于本例中使用 pause 命令暂停,屏幕一定会得到及时的更新,drawnow 如果去掉效果一 样。


相关文章:
MATLAB教程 R2014a 答案 全 张志涌
第四章 1 数值差分 d=0.001; dxdt_diff=diff(y)/d; dxdt_grad=...matlab教程_R2010a张志勇... 21页 免费 ©2016 Baidu 使用百度前必读 | 文库...
Matlab快速入门(2014年版)
PageDown Backspace 四、操作举例:最简单的计算器使用法例 1:求 [12 ? 2 ?...第1章 MATLAB快速入门 22页 1下载券 matlab入门教程(快速入门... 182页 2...
matlab经典教程全集
第四章 MATLAB 函数 --- 语音讯号分析 o 4.1 数学函数 4.1.1 常见数学函数...先进的资料视觉化功能 - MATLAB 的物件导向图形架构让使用者可执行视觉数据 分,...
Matlab学习教程 第四章(4)上机练习
Matlab学习教程 第四章(4)上机练习_理学_高等教育_教育专区。第 4 章 图形处理...(2)网图函数 (a)函数 meshgrid (b)函数 mesh 例 4-15 使用 mesh 函数...
MATLAB 实用教程 课后习题答案
MATLAB 实用教程 课后习题答案_计算机软件及应用_IT/计算机_专业资料。MATLAB ...[a,b,c]=sph2cart(1,1,1) [d,e,f]=cart2pol(a,b,c) 第四章 1...
含答案《MATLAB实用教程》
含答案《MATLAB实用教程》_工学_高等教育_教育专区。Matab 实用教程(第 3 版) 主编:郑阿奇编著:曹弋 《MATLAB 实用教程 3 版》 版权所有 翻版必究 第二章 ...
2013第四章matlab攻略
三 各种概率分布的交互式观察界面 【例 4.3-3】概率分布交互界面使用方法介绍。...matlab 2013 教程 第11章... 30页 1下载券 matlab 2013 教程 第9章 15...
matlab教程详解 (4)
matlab教程详解 (4)_电子/电路_工程科技_专业资料...第四章 数值计算 4.1 引言本章将花较大的篇幅讨论...因此,关于述泛函 指令,本章新版着重讲述如何使用“...
实用MATLAB教程第三章
实用MATLAB教程第一章 实用MATLAB教程第四章 实用MATLAB教程第五章 实用MATLAB教程...第3章 MATLAB 符号计算 MATLAB 的数学计算分为数值计算和符号计算,在第二章中...
MATLAB教程习题答案
MATLAB 教程(张志涌 杨祖樱编 2006.8 第一版)习题答案 第二章 %p92_1 a=7...使用一键分享,轻松赚取财富值, 了解详情 嵌入播放器: 普通尺寸(450*500pix) ...
更多相关标签: