讲义
第一章 MATLAB系统概述
1.1 MATLAB系统概述
MATLAB(MATrix LABoratory)矩阵实验室的缩写,全部用C语言编写。
特点:
(1)以复数矩阵作为基本编程单元,矩阵运算如同其它高级语言中的语言变量操作一样方便,而且矩阵无需定义即可采用。
(2)语句书写简单。
(3)语句功能强大。
(4)有丰富的图形功能。如plot,plot3语句等。
(5)提供了许多面向应用问题求解的工具箱函数。目前,有20多个工具箱函数,如信号处理、图像处理、控制系统、系统识别、最优化、神经网络的模糊系统等。
(6)易扩充。
1.2 MATLAB系统组成
(1)MATLAB语言
MATLAB语言是高级的矩阵、矢量语言,具有控制流向语句、函数、数据结构、输入输出等功能。同时MATLAB又具有面向对象编程特色。MATLAB语言包括运算符和特殊字符、编程语言结构、字符串、文件输入/输出、时间和日期、数据类型和结构等部分。
(2)开发环境
MATLAB开发环境有一系列的工具和功能体,其中大部分具有图形用户界面,包括MATLAB桌面、命令窗口、命令历史窗口、帮助游览器、工作空间、文件和搜索路径等。
(3)图形处理
图形处理包括二维、三维数据可视化,图像处理、模拟、图形表示等图形命令。还包括低级的图形命令,供用户自由制作、控制图形特性之用。
(4)数学函数库
有求和、正弦、余弦等基本函数到矩阵求逆、求矩阵特征值和特征矢量等。
MATLAB数学函数库可分为基本矩阵和操作、基本数学函数、特殊化数学函数、线性矩阵函数、数学分析和付里叶变换、多项式和二重函数等。
(5)MATLAB应用程序接口(API)
MATLAB程序可以和C/C++语言及FORTRAN程序结合起来,可将以前编写的C/C++、FORTRAN语言程序移植到MATLAB中。
1.3 MATLAB的应用范围包括:
MATLAB的典型应用包括:
●数学计算
●算法开发
●建模、仿真和演算
●数据分析和可视化
●科学与工程绘图
●应用开发(包括建立图形用户界面)
以矩阵为基本对象
第二章 Matlab基础
2.1 MATLAB快速入门
(1)搜索路径
搜索路径也被看作是MATLAB的路径,其包含的文件被认为在路径上。搜索路径设置存放在文件pathdef.m中,称为当前目录,当要在MATLAB中打开一个文件时,就以当前目录为开始点。
当输入一变量value时,MATLAB的搜索路径次序:
value是否为变量
value是否为内部函数
当前目录中是否存在value.m文件
搜索路径上是否存在value.m文件
path函数可以控制MATLAB的目录搜索路径,主要使用的格式:
path 显示当前的搜索路径
p=path 把当前的搜索路径存到字符变量P中
path('newpath') 设置路径为'newpath'
path(path,'newpath') 向当前路径添加一个新目录
addpath函数向MATLAB的搜索目录中添加一个新目录。
addpath 路径名
path(path,?路径名?):增加搜索路径
rmpath函数从MATLAB的搜索路径删除一个目录。
rmpath 路径名:删除路径
还可以利用菜单:File->setpath(路径浏览器)
what:显示出搜索路径上的文件名
what路径名:路径名中的文件名
type value:显示变量内容
edit 文件名:对m文件进行编辑
(2)工作空间(Workspace)
工作空间是一个重要而且比较抽象的概念,它是指运行MATLAB 程序或命令所生成和存储在内存中的所有变量和MATLAB提供的常量构成的集合。通过使用函数、运行M文件和装载保存的工作空间,可以向工作空间增加变量。
●save保存整个工作空间或一部分变量,使用方式:
save workspace as 文件名
或
save 文件名 [变量名]
●load恢复工作空间,使用方式:
load workspace
load 文件名
●工作空间浏览器:File->Show Workspace
●还有一组命令来管理这些变量。
who,whos:显示出工作空间中的变量列表。
clear [变量名]:清除变量
(3)MATLAB命令窗口
●输入命令和输出结果。
如输入:help [函数名]
a=6
2.2 矩阵、变量、运算和表达式
(1)矩阵的输入
A.直接输入:
注意:(1)行元素间用空格或逗号(,)隔开;
(2)行与行之间用分号(;)或回车;
(3)整个元素列表用[]括起。
直接输入的矩阵为一全局变量,一直保存在内存中。
例: a=[1 2 3;4 5 6]
a=
1 2 3
4 5 6
a=[1,2,3;4,5,6;7,8,9] ? a=[1 2 3; 4 5 6; 7 8 9]
矩阵元素:可以灵活地描述矩阵元素,
●矩阵元素a[i,j] 按列存放
通过下标单独对元素赋值
例:a(1,1)=1,a(3,2)=a(1,1) 得到
a =
1
a =
1 0
0 0
0 1
即自动形成一个3行2列矩阵,对未赋值的元素充值0。
●矩阵的元素可以用任意形式的表达式
例:算术表达式
x=[-1,sqrt(5),(2+7)^4]
x =
1.0e+003 *
-0.0010 0.0022 6.5610
●大矩阵可以用小矩阵作为元素
例:a=[1 2;3 4]
b=[a a+5;a-5 zeros(size(a))]
例:A=[1,2,3;4,5,6]
A =
1 2 3
4 5 6
B=[A;7,8,9]
B =
1 2 3
4 5 6
7 8 9
●可以从矩阵中抽取某些元素构成新矩阵
C=A(1:2,:)
C =
1 2 3
4 5 6
例:a=[3,4,5;6,7,8]
b=[+2,4*5,6]
c=[sin(0.5*pi),sqrt(4),0]
d=[a;b;c]
●复数的表示
MATLAB支持复数的运算,复数的虚部用i或j表示。例:a=1+2i或a=1+2j 二者表示的结果一样。
复数可以直接运算,
例:a=3+4i;
b=5+6j
a+b
输出:ans=
8.0000+10.0000i
复数运算的一些常用函数:
①abs 返回复数的模
②angle 返回复数的相角
③conj 返回共轭复数
④imag 返回复数的实部
⑤real 返回复数的虚部
B.用语句或函数产生:
a=randn(5,5) 产生正态分布5*5的随机矩阵。
C.用M-文件或外部数据文件产生:
M-文件是一个以.m为后缀的文本文件,文件内容为一系列MATLAB命令,在MATLAB环境下键入该文件名(不包括后缀),文件中的全部命令会依次逐个执行;M-文件名(不包括后缀)相当于一个宏命令.
例如:一个名为magik.m的文件包含了如下的内容,(假设magik.m在当前目录下)
A = [
16.0 3.0 2.0 13.0
5.0 10.0 11.0 8.0
9.0 6.0 7.0 12.0
4.0 1
5.0 14.0 1.0 ]
在Matlab环境下执行如下命令:
magik
A
A =
16 3 2 13
5 10 11 8
9 6 7 12
4 1
5 14 1
D.用矩阵编辑器创建和修改矩阵:
使用File->Show workspace
(2)矩阵运算
运算符 +,-,*,/(右除),\(左除) 和^(幂)。
右除:C=A/B即C满足CB=A,当B可逆时,A/B=AB-1
左除:C=A\B即C满足AC=B,当A可逆时,A\B=A-1B
幂A^n = A*…*A; A必须是方阵。
例:矩阵的加减法:
a=[1:3;4:6;7:9]
b=a; c=a+b; c=a-b
注:矩阵相加减必须有相同的维数。
例:矩阵的点乘运算,^运算时矩阵必须为方阵,且只能与数字运算。
d=a*b 必须符合m*n与n*l的结构。
d=a.*b 矩阵的点乘运算
例:\(左除):A\B=inv(A)*B,其中inv(A)表示A逆阵,例如求解AX=B。
A=[1 0 0;0 4 0;0 0 9];
B=[1 2 3;0 1 0;0 1 1];
X=A\B
/(右除): A/B=A*inv(B),例如求解XA=B。
X=B/A
(3)变量与表达式
●Matlab的赋值语句有两种形式:
其一为:<变量>=表达式;
其二为:表达式,将表达式的值赋于一个自动定义的变量ans。
注:A:如果以;结尾,则不显示计算结果,否则显示计算结果。
B:除保留字外,变量可以用字母开头,后跟19个字母或数字。变量名区分大小写,变量使用时不需要先定义,也不必定义变量的类型。
●可以用who或whos来显示已定义的变量
例如:
who
Your variables are:
A B C a ans
whos
Name Size Bytes Class
A 2x3 48 double array
B 3x3 72 double array
C 2x3 48 double array
a 3x2 48 double array
ans 1x1 8 double array
Grand total is 28 elements using 224 bytes
一些常用的变量
pi 3.14159265 //π值
i sqrt(-1 ) //虚数单位
j same as i
eps floating-point relative precision, 2.2204e-016 //容量变量
realmin smallest floating-point number, 2.2251e-308 //最小浮点数
realmax largest floating-point number, 1.7977e+308 //最大浮点数
inf infinity (任意一个非零数除以0) //正无穷大
nan Not-a-number (0/0 或inf-inf) //非数如:
r=1/0
r=inf
1/r
ans=0
(4)矩阵的其他简单运算:
A?: 矩阵转置
inv(A):A-1
sum(A):得到一个行向量,其元素为A的每一列的和
a=[1 2 3;4 5 6]
sum(a) sum(a’)
diag(A):得到一个列向量,其元素为A的对角元
sum(diag(a))
冒号(:)运算符:
a:b:c:生成一个由等差数列构成的行向量X,X(i+1)-X(i)=b
例:0:pi/4:pi
ans =
0 0.7854 1.5708 2.3562 3.1416
如果省略b,则等差数列的公差为1
a=0:0.05:1
x=linspace(0,1,75)
a=1:4;b=1:2:7;c=[b,a]
等比数列:logspace(0,2,11) 创建起点为10,终点为102,11个元素,公比为100.2 矩阵的变换:rot90: 矩阵逆时针旋转n*90度。
fliplr: 矩阵左右翻转。
flipud: 矩阵上下翻转。
稀疏矩阵的存储:
sparse(A):用于把完全矩阵压缩为稀疏矩阵。
A=[0,1,0,0;0,3,0,4;5,0,0,0;0,0,0,7]
sparse(A)
ans=
(3,1) 5
(1,2) 1
(2,2) 3
(2,4) 4
(4,4) 7
sparse(i,j,u):函数直接造成稀疏矩阵,i,j为向量分别对应行号和列号,u也为向量,存储非元素的值.
i=[1,2,2,3,4]
j=[2,2,4,1,4]
u=[1,3,4,5,7]
A=sparse(i,j,u)
full函数把稀疏矩阵还原为完全矩阵。
(5)数组及其运算:
数组可以看作是行向量,实质为阵列运算。是元素对元素的运算,用句号(.)来区别。
数组和矩阵之间的区别在于运算规则不同,矩阵运算由线性代数规则来定义。
运算符:+,-和.*, ./, .\,.^
A.*B:A与B对应的元素相乘
A.\B:B的元素除以A的相应元素
A./B: A的元素除以B的相应元素
A.^B:A的元素为底,B的相应元素为幂的数组
如:a=[1:3;4:6;7:9]
b=a; c=a+b; c=a-b
查看下列运算的结果:
a*b a.*b a/b a./b a\b a.\b a^b(指数和底数均为矩阵,无法求解) a.^b a? a.?2.3 基本数学函数
abs(绝对值或复数模)
sqrt (平方根)
real(复数的实部)
imag (复数的虚部)
conj(复数的共轭)
round (舍入为最接近的整数) //round(-0.5)=-1 round(0.4)=0
fix (向0方向舍入为整数) //fix(0.99)=0 fix(1.01)=1
floor (向负无穷大舍入为整数) //floor(-0.5)=-1 floor(0.5)=0
ceil (向正无穷大舍入为整数) //ceil(-0.5)=0 ceil(0.6)=1
sign (符号函数)
rem(x,y)(取余数函数) //得到x/y的余数,rem(11,4)=3
sin cos tan asin atan //三角函数都是面向阵列中的元素操作,角度单位均为弦度。
atan2(y,x) //-pi <= atan2(y,x) <= pi
sinh (双曲正弦) cosh tanh
exp (以e为底的指数)
log (自然对数)
log10 (常用对数)
bessel (贝塞尔函数)
gamma (伽码函数)
rat (无理数的分式有理逼近)[N, D] = rat(x,tol), 要求:abs(x-N/D)<=tol*abs(x), tol的缺省值为tol = 1.e-6*norm(X(:),1) 其中:norm( X ( : ),1) = max(sum(abs((X))))
2.4 关于矩阵的一些有用的工具
产生矩阵的工具:
…[]?表示空矩阵
空矩阵不包含任何元素,它的维数为0*0;空矩阵可以在运算中传递。
例:A=[1,2,3;4,5,6;7,8,9]
A(2,:)=[]
输出:
A=
1 2 3
7 8 9
空矩阵有矩阵缩维的作用。
●eye:单位矩阵:对角线元素为1。
A=eye(3,3)
A=
1 0 0
0 1 0
0 0 1
●zeros:所有的元素都是0
Z = zeros(2,4)
Z =
0 0 0 0
0 0 0 0
●ones:所有的元素都是1
Z= 5*ones(3,3)
Z =
5 5 5
5 5 5
5 5 5
●rand:矩阵元素是用均匀分布在[0.0,1.0]内产生的随机数
●rand(n):产生一个n阶(0-1)的随机矩阵
Z=rand(3)
Z =
0.1094 0.6599 0.1785
0.9888 0.3514 0.3573
0.5860 0.8495 0.5347
rand(m,n): 产生一个m*n阶(0-1)的随机矩阵
Z=rand(1,6)
Z =
0.5976 0.4628 0.7678 0.5902 0.3969 0.1927
产生[-a,a]之间均匀分布的随机数的公式:R=a-2*a*rand(m,n)
●randn:矩阵元素是用期望为0,方差为1的正态分布产生的随机数
Z=randn(3)
Z =
-0.4326 0.2877 1.1892
-1.6656 -1.1465 -0.0376
0.1253 1.1909 0.3273
产生均值为b,方差为q2的正态分布随机数的公式:S=q*randn(m,n)+b
●其它特殊矩阵:
例:a=[1 2 3;4 5 6;7 8 9]
1.diag(a) %% 生成矩阵a的对角矩阵
ans =
1
5
9
2.compan:伴随矩阵
例:
u = [1 0 -7 6]
A = compan(u)
A =
0 7 -6
1 0 0
0 1 0
eig(compan(u))
ans =
-3.0000
2.0000
1.0000
即方程的根。
3.magic:魔方矩阵(矩阵的元素由1~10组成,行、列和对角线之和相等)
例:magic(5)
ans =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
4.tril(a) %% 生成矩阵a的下三角矩阵
ans =
1 0 0
4 5 0
7 8 9
5.triu(a) %%生成矩阵a的上三角矩阵
ans =
1 2 3
0 5 6
0 0 9
注:1.下标引用:
在Matlab中,矩阵元素的引用可用两个下标来表示,如矩阵A中,第i行第j列的元素用A(i,j)引用,也可以用一个下标来表示,用单个下标表示元素并不只限于矢量。对于矩阵,由于Matlab的运算基本上都是对列操作的,矩阵可以认为是按列优先排列的一个长的列矢量,从而可用单下标引用。
例如2*2的矩阵,A(1)表示第一列的第一个元素,A(2) 表示第一列的第二个元素,A(3)表示第二列的第一个元素,A(4)表示第二列的第二个元素,当矩阵的下标超出矩阵的实际元素的下标时,将给出错误信息。但是,当某个值被赋给矩阵的一个新的元素时,Matlab会自动增加矩阵的维数大小。例如4*4的矩阵A,执行命令A(4,5)=17后,矩阵A将变成4*5的矩阵。
在下标的表达式里使用冒号表示矩阵的一部分。例如矩阵A(1:k,j)表示矩阵A的第j列的前k个元素。例如sum(a(1:4,4)),表示计算第四列的前四个元素元素的和。
A(:,j)表示矩阵A的第j列的所有元素。由于有了冒号运算符,例如求矩阵A的第j列元素之和,表示式为sum(A(:,j)。
2.如何建立多维矩阵:
在科学研究与工程运算中,要建立多维矩阵,方法之一是扩展二维矩阵。
例:先建立一个简单的二维矩阵:
a=[5 7 8;0 1 9;4 3 6]
为a矩阵扩展第三维
a(:,:,2)=[1 0 4;3 5 6;9 8 7]
方法之二,使用cat函数。它将现有的矩阵按照指定的维数建立新的多维矩阵。
B=cat(dim,A1,A2,...)
例:b=cat(3,[2 8;0 5],[1 3;7 9])
2.5 复杂的矩阵运算
一些矩阵运算:
size(A):得到矩阵的阶,得到矩阵的n行m列.
rank(A):得到矩阵的秩
det(A):行列式
eig(A):特征值和特征向量
e=eig(A) 得到特征值
[v,d]=eig(A): A*v=v*d
svd(A):矩阵的奇异值分解[u,s,v]=svd(A), u,v正交阵,s对角阵,A=usv?
cond(A):得到矩阵的条件数(最大奇异值和最小奇异值的比值)
lu(A): LU分解(A必须是一个方阵)
[l,u]=lu(A): u上三角阵,l:一个下三角阵和一个置换矩阵的积
[l,u,p]=lu(A):u上三角阵,l:下三角阵,p:置换矩阵
qr(A): QR分解
[q,r]=qr(A):r:上三角阵,q:正交阵
2.6 矩阵输出格式
格式命令(数字)
X=[4/3 1.2345e-6];
format short:以定点数形式显示,小数后面保留4位有效数字
X
X =
1.3333 0.0000
format short e:以浮点数形式显示,小数后面保留4位有效数字
X
X =
1.3333e+000 1.2345e-006
format short g:以定点数或浮点数的最佳形式显示,小数后面保留4位有效数字X
X =
1.3333 1.2345e-006
format long:以定点数形式显示,小数后面保留14位有效数字
X
X =
1.33333333333333 0.00000123450000
format long e 以浮点数形式显示,小数后面保留14位有效数字
X
X =
1.333333333333333e+000 1.234500000000000e-006
format long g 以定点数或浮点数的最佳形式显示,小数后面保留14位有效数字X
X =
1.33333333333333 1.2345e-006
format bank 以货币方式显示
X
X =
1.33 0.00
format rat 用有理数近似表示
X
X =
4/3 1/810045
format hex 用16进制表示
X
X =
3ff5555555555555 3eb4b6231abfd271
format compact 以紧凑形式显示(format loose 以松散形式显示)
X
X =
3ff5555555555555 3eb4b6231abfd271
长命令行用“…”来表示连接
第三章图形
在分析问题的结果的时候,图形往往是一种很有用的工具,它可以帮助我们直观地了解结果的某些性态。Matlab提供了很强的图形功能,能够在根据向量或矩阵给定数据来生成图形。
Matlab图形有数据可视化和图形处理两大功能,在数据的可视化部分,Matlab可使用户计算所得的数据根据其不同情况转化成相应的图形。用户可以选择直角坐标、极坐标等不同的坐标系;它可以表现出平面曲线、空间曲线,绘制直方图、向量图、柱状图及空间网状面图、空间表面图等。
图形函数有4种:
通用图形函数、二维图形函数、三维图形函数、特殊图形函数.
3.1 图形窗口
图形窗口(Figure Window)是所有Matlab的图形输出的专用窗口。figure:用来打开一个绘图窗口,以供后续绘图命令输出图形。
创建图形窗口的命令:figure
两种格式:figure
figure(n)
图形窗口的名称是按照该窗口创建的时间顺序依次命名的:Figure No.1,Figure No.2.....Figure No.n,命令figure将创建一个名为figure No.n+1的新的空白图形窗口,而figure(n)命令则若figure
No.n窗口已存在,则成为当前窗口。
h=figure(n)可得到图形窗口的句柄。
两个查阅图形参数和参数值的命令:
get(n):get(n)将返回关于图形窗口 Figure No.n 的所有图像参数的名称和当前值。
set(n):set(n)将返回关于图形窗口 Figure No.n 的所有图像参数的名称和其可能取的值。
3.2 创建二维图形(Plot函数)
Plot是最简单而且使用最广泛的一个线型绘图函数,是Matlab的内部函数。
作用:可以生成线段、曲线和参数方程曲线图形。
几种基本命令形式:
(1)向量式:plot(v)
参数v可以是向量、实数阵和复数阵。v是长度为n的数值向量,生成(i,v(i))的一条折线,坐标轴的范围由MATLAB系统根据向量的长度元素的大小自动生成,当向量的元素充分多时,即可以得到一条外观光滑的曲线。
例:x=0:pi/20:2*pi;plot(x)
例:x=peaks;plot(x)
(2)参数式:plot(x,y)
x,y都是长度为n的向量,它的作用是在坐标系中生成顺序连接顶点{x(i),y(i)}的折线,绘得的连线图以x为横坐标,y为纵坐标。这种调用可以用来生成参数方程的图形。
例:y=sin(x);plot(x,y)
例:x1=0:1:10*pi;
x2=0:0.01:10*pi;
y1=sin(x1).*x1;
y2=sin(x2).*x2;
plot(x1,y1)
hold on
plot(x2,y2)
(3)矩阵式:plot(y)
y是一个(m*n)和矩阵,为矩阵的每一列画出一条线。同时以矩阵的行向量为基准对x轴进行分度和标注,标准时,采用向量1:m,这里m中矩阵的行数。
例:z=peaks; %%产生一个49*49的矩阵
plot(z)
(4)混合式:plot(x,y)
如果X,Y均为向量,则长度必须相等,亦即参数式;如果X是向量,而Y是一个矩阵,X的长度与矩阵Y的行数或列数相等,则它的作用是将向量X与矩阵Y的每列或每行的向量相对应作折(曲)线,当Y 是方阵时,则将向量X与矩阵Y的列向量相对应作图;如果X是矩阵,Y是向量,Y的长度等于X的行数或列数,则将X的每列或每行的向量与Y相对应作图。同样,当X是方阵时,则将X的各列与Y相对应作图;如果X和Y都是矩阵,且维数相同,那么按列与列的对应方式来作图。
例:y=1:length(peaks);plot(peaks,y)
(5)复向量式:plot(z)
z为复向量,会忽略向量的虚部,相当于plot(real(z),imag(z))
例:随机矩阵特征值分布plot(eig(real(20,20),?o?,?Markersize?,6)
(6)综合调用:plot(x1,y1,x2,y2,...)
矩阵中有多个矩阵调用对,其中的每一对按前四种方式之一进行调用,不同的矩阵对之间,其维数可以不同。
例:t=0:pi/10:2*pi;
y1=sin(t);
plot(t,y1);
可以使用plot同时显示由若干个x-y对表示的图形:
y2=sin(t-0.5);
y3=sin(t-0.25);
plot(t,y1,t,y2,t,y3);
从图上我们可以看出,为了体现不同x-y对表示的图形,Matlab自动地使用了不同的颜色;此外我们还可以使用如下格式来设置图形的性态。
3.3 线型、顶点标记和颜色
在调用plot函数时MATLAB自动安排作图的线型的线段的颜色,包括线段顶点的标记。事实上,MATLAB 的plot函数可以设置和管理曲线的线段类型、顶点标记和颜色(在MATLAB中,它们通称为线型Line Style)。
2.如果不指定作图的颜色,自动循环使用y,m,c,r,g,b,w 7种颜色画线
plot的最典型的调用方式是三元组参数:
plot(x,y,?color-style-marker?)
例:plot(t,y,'b+', t, y2,'k-X', t,y3,'r--*')
例: [x,y,z]=peaks; //多输出函数,函数可产生多个输出值,输出值之间用逗号分开。
contour(x,y,z,20,?k?)
hold on
pcolor(x,y,z)
shading interp
其中:peaks:根据Gauss分布(正态分布)得到3个49阶矩阵
contour:用相同的颜色画20条等高线,
pcolor:将(x,y)点上的颜色设置成z
shading interp:设置渲染方式,
例:x=0:0.25:5; y1=x.^0.1;
y2=x.^0.5; y3=x.^0.8;
y4=x; y5=x.^1.5;
y6=x.^2; y7=cos(x);
y8=sin(x);
hold on
plot(x,y1,?yo?,x,y2,?mx?,x,y3,?c+?,x,y4,?rs?);
plot(x,y5,?gh?,x,y6,?bd?,x,y7,?w,x,y8,?kp?);
3.4 subplot 函数
在一个已存在图形的绘图窗口中增加一个图形(在这之前讲的都是覆盖方式)hold on,加到图形上,hold off则取代当前窗口。
允许在同一绘图窗口中显示或在同一纸上打印多个图形。
subplot(m,n,p):将一个绘图窗口分割成m*n个子窗口,每一小块有自己的坐标轴,p为活动窗口,并且在p个窗口绘制当前图形,如果坐标系已存在,则subplot(p)设置当前坐标系。
例如:
t=0:pi/10:2*pi;
[x,y,z]=cylinder(4*cos(t));
%% (生成一个单位圆柱体,采用[0,1]之间的等距节点,每一个节点的旋转半径是4*cos(t), 相当于4*cos(t)母线CYLINDER(R,N), CYLINDER(R)(此时, n=20))
subplot(2,2,1); mesh(x) %%(x=1:m, y=1:n, z=x, c=x)
subplot(2,2,2); mesh(y);
subplot(2,2,3); mesh(z);
subplot(2,2,4); mesh(x,y,z)
subplot(111)是个特殊的情况,与subplot(1,1,1)不同,它使下一条绘图指令在窗口中执行elf和reset指令(即删除当前图形的所有子对象),然后在默认位置创建一个坐标系。
绘制复数图形:plot(z) plot(real(z), imag(z))
例如:
t=0:pi/10:2*pi;
plot(exp(i*t),'-o')
3.5 坐标轴控制 axis函数
axis函数可控制坐标轴的刻度,使两个图形在对比时,有相同的比例因子。也可用于复杂图形的局部透视。
axis命令的格式:
axis([xmin xmax ymin ymax]) 设置X,Y轴的极限范围
axis square:保持X,Y轴
axis equal:设置X,Y轴等长
axis auto:设置X,Y轴为自动格式
axis on 显示X,Y轴
axis off 关闭X,Y轴
grid off 图形网格不显示
grid on 图形网格显示
例:复杂函数的局部透视,利用axis函数调整x轴刻度,可以比较清楚地看到某一局部区域。
x=0:1/3000:1;y=cos(tan(pi*x));
figure(1),subplot(2,1,1),plot(x,y)
title('复杂函数')
subplot(2,1,2),plot(x,y)
axis([0.4 0.6 -1 1]);
title('复杂函数的局部透视')
例:利用axis square使输出图形的保持x,y轴,这样在图形窗口中绘制圆或椭圆都可用圆来表示。
t=0:pi/20:2*pi;
figure(1),subplot(2,2,1),plot(sin(t),cos(t))
title('圆形轨迹')
subplot(2,2,2),plot(sin(t),2*cos(t)),title('椭圆形轨迹')
subplot(2,2,3),plot(sin(t),cos(t)),axis square
title('调节后的圆形轨迹')
subplot(2,2,4),plot(sin(t),2*cos(t)),axis square
title('调节后的椭圆形轨迹')
坐标标题及图中的文本使用函数:xlabel、ylabel、zlabel、text、title。
说明:
(1)xlabel、ylabel、zlabel为x,y,z轴的标记。
(2)text在当前坐标系中建立文本对象。
格式:text(x,y,?string?)
在图形的(x,y)点上放置指定的字符串。
text(...,?PropertyName?,?PropertyValue?,...)为标题文本指定特性。
特征为:∧表示为上标、_为表示下标、
\leftarrow表示为←
\rightarrow表示为→
\it{斜体文字}
arrow表示箭头
bottom表示上下箭头。
text(x,y,z,?string?) 在三维图形上放置文字
text(x,y,?string?,?color?,?k?) 放置文字的同时设置颜色。
例:
t=-pi:pi/100:pi;
y=sin(t);
plot(t,y)
axis([-pi pi -1 1])
xlabel('-\pi \leq \itt \leq \pi')
ylabel('sin(t)')
title('Graph of the sine function')
text(1,-1/3,'\it{Note the odd symmetry,}','color','r')
(3)gtext与text的不同是可利用鼠标放置文本。
例:
t=-pi:pi/20:pi;
y1=sin(t);y2=2*cos(t);
plotyy(t,y1,t,y2),grid on
title('双Y轴正弦曲线')
gtext('sin(t)')
text(pi/2,0,'\leftarrow 2cos(t)')
(4)plotyy:双Y轴的图形,同一张图上表示两条曲线时,可拥有各自的Y轴。
(5)title给当前坐标系加上标题。
例:在同一张图上绘制出双y轴的y1=sin(x)和y2=2cos(x)函数。
x=-pi:pi/20:pi;
y1=sin(x);y2=2*cos(x);
plotyy(x,y1,x,y2);
grid on
title('双y轴正余弦曲线')
text(0,0,'\leftarrow sin(t)')
text(pi/2,0,'\leftarrow 2cos(t)')
3.6 专门用于绘制一元函数曲线的命令fplot
在plot命令中,系统是将从外部输入或间接确认的数值矩阵转化为连线图的。而在实际应用中绘制函数的二维曲线时,一般并不清楚函数的具体情况,因而在确定自变量x的取值间隔时,往往一律用平均间隔,这样往往不大准确。取好了,可以表现出函数图像的大概情况,取差了,则会因某处x元素的间隔太大而根本错绘了曲线,不能反映出函数的变化情况从而使绘图失败。
fplot不是直接从外部接收数据,而是通过其内部自适应算法而产生的。即在函数值变化比较平稳处,它所取的数值点就会自动相对稀疏一些,在函数值变化剧烈处,所取有数值点就会自动密集一些。所以对于曲线起伏剧烈的函数,用fplot命令将比用一般等间距取点的plot命令绘得的曲线光滑准确一些。
fplot命令的具体使用格式为:
fplot(…function_name?,limits,tol,?linespec?,p1,p2,...)
[x,y]=fplot(…function_name?,limits,tol,?linespec?,p1,p2,...)
其中:…function_name?:待绘制函数曲线的函数名称
limits :limits=[xmin,xmax],为x的取值空间
tol :为fplot命令在进行运算中的相对误差。tol越小,所绘得的曲线就越接近实际曲线的情况,但系统要为此占用很大的资源。
linepsec : 线型设置
p1,p2... : 函数传递的参数
x,y :输出数据点坐标
例:fplot与plot命令的比较。
function y=funfplot(x)
y=sin(1./tan(pi.*x));%%建立一个函数funfplot
[X,Y]=fplot(…funfplot?,[-0.1,0.1],2e-4);
n=size(X);
x=-0.1:0.2/(n(1)+1):0.1;
y=funfplot(x);
plot(x,y),hold on
plot(X,Y)
3.7 专门用于绘制一元符号函数曲线的命令ezplot
如果符号函数中只含有一个变量,那么Matlab将其视为一个普通函数,画出其在某个区域内的图像用ezplot命令。
格式:ezplot(sym_function,limits)
其中:sym_function 符号函数或代表它的符号变量。
limits limits=[x1,x2],为x的取值空间。其默认值为[-2pi,2pi]
ezplot(f) %%f=f(x) -2π< ezplot(f,[min,max]) %% min ezplot(f,[xmin,xmax,ymin,ymax]) %%xmin ezplot(x,y) ezplot(x,y,[tmin,tmax]) ezplot(...,figure) 例: 1.ezplot(…x^2-y^4?) 2.ezplot(…(x^2)^(sin(x)^2)?) 3.8 二维特殊图形 x轴之间的区间填充指定颜色。 用面积图描述某公司1990-1994年销售与利润情况。 sales=[51.6 82.4 90.8 59.1 47.0]; x=90:94; profits=[19.3 34. 61.4 50.5 29.40]; area(x,sales,'FaceColor',[.5 .9 .6],'EdgeColor','b','Linewidth',2) hold on area(x,profits,'facecolor',[.9 .85 .7],'edgecolor','y','linewidth',2) hold off set(gca,'Xtick',[90:94]);set(gca,'Layer','top'); gtext('\leftarrow sales');gtext('profits'),gtext('expenses') xlabel('years','fontsize',10), ylabel('Sales in 1,000''s','fontsize',10) 面积图例: Y = [ 1, 5, 3; 3, 2, 7; 1, 5, 3; 2, 6, 1]; area(Y):grid on colormap summer set(gca,'Layer','top') title 'Stacked Area Plot' 例2:用bar函数绘制向量y的直方图 x=0:pi/10:2*pi; y=cos(x); bar(y); %%取Y元素的下标作为X坐标值 hold on bar(x,y,?r?); 将bar换成barh成垂直的直方图、bar3成三维直方图、bar3h成垂直的三维直方图。 例3:用随机函数rand产生一个矩阵,从而得到复杂的条形图。 y=round(rand(5,3)*10); figure(1) subplot(2,2,1),bar(y,?group?),title(…Group?) subplot(2,2,2),bar(y,?stack?),title(…Stack?) subplot(2,2,3),barh(y,?stask?),title(…Stack?) subplot(2,2,4),bar(y,1.5),title(…width=1.5?) 例4:用errorbar(x,y,e)绘制误差棒图 x=1:10; y=sin(x); e=std(y)*ones(size(x)); errorbar(x,y,e) 注:x,y,e必须是同维; 该指令常用于数理统计离散数据有理化。 例5:hist函数可在二维平面上绘制出柱状图,用来表示数据值的分布情况。其常用格式hist(y,x)。并且可以绘制笛卡尔坐标系和极坐标系两种方式。 分布统计直方图 x=-2.9:0.1:2.9; y=randn(20000,1); figure(1),hist(y,x) title(…柱状图表示数据分布?) 用rose绘制12小时的风向图 wdir=[45 90 90 45 380 335 360 270 335 270 335 335]; wdir=wdir*pi/180; rose(wdir) 例6:pie函数可绘制出饼图,其常用格式为pie(x),可按向量x中的值的大小绘制出饼图。pie(x,explode)可利用explode指定分离出的切片。 x=[1.1 2.8 0.5 2.5 2]; explode=[0 1 0 0 0]; figure(1) colormap hsv pie(x,explode) title(…饼图?) 注:当x各元素和大于1时,函数对数据进行归一化处理;当各元素和小于1时,函数不对矢量进行归一处理,而只是绘制部分饼图。如:pie([0.1,0.2,0.6]) 例7:对于离散数据,采用stem函数。 alpha=0.02;beta=0.5;t=0:4:200; y=exp(-alpha*t).*sin(beta*t); stem(t,y) xlabel('Time in \musecs');ylabel('Magnitude') stem3函数在三维空间描述离散序列。 th=(0:127)/128*2*pi;x=cos(th);y=sin(th); f=abs(fft(ones(10,1),128)); stem3(x,y,f','d','fill') view([-65 30]); stairs函数描述离散序列。 alpha=0.01; beta=0.5; t=0:10; f=exp(-alpha*t).*sin(beta*t); stairs(t,f);hold on plot(t,f,'--*');hold off 3.9 网格和曲面 MATLAB具有强大的三维图形处理功能,包括三维数据显示、空间、曲面、分块、填充以及曲面光顺着色、视点变换、旋转、隐藏等功能和操作。 (1)plot3(x,y,z,Linespec) plot3是一个可用来画单变量的三维函数,函数格式除了包括第三维的信息之外,其它与二维函数plot相同。 例:绘制一个三维螺旋线。 t=0:pi/50:8*pi; figure(1) plot3(sin(t),cos(t),t) grid off,axis square title('三维螺旋线') 例:增加维数的plot3命令可以使多个二维图形沿一个轴排列起来,而不是直接将二维图形叠加到另一个的上面。下例就是二维图形在三维空间的排列。 x=linspace(0,3*pi); z1=sin(x); z2=sin(2*x); z3=sin(3*x); y1=zeros(size(x)); y3=zeros(size(x)); y2=y3/2; plot3(x,y1,z1,x,y2,z2,x,y3,z3); grid,xlabel(?x-axis‘),ylabel(?y-axis‘),zlabel(?z-axis‘) title(?sin(x),sin(2x),sin(3x)‘) (2)平面网格点的生成 在数学上,函数z=f(x,y)的图形是三维空间的曲面,在MATLAB中,总是假设函数z=f(x,y)是定义在一个矩形的区域D=[x0,xm]*[y0,yn]上的。为了绘制在区域D上的三维曲面,MATLAB的方法是首先将[x0,xm]在x方向上分成m份,将[y0,yn]在y方向分成n份,由各分划点分别作平行于坐标轴的直线,将区域D分成m*n个小矩阵块,计算出在网格点的函数值。对于每个小矩形,在空间中决定出4个顶点(xi,yi,f(xi,yi)),连接4个顶点得到一个空间中的四边形片。所有这些四边形片一起构成函数z=f(x,y)定义在区域D上的空间网格曲面。 为方便起见,MATLAB中用meshgrid函数产生x,y轴向的网格数据,meshgrid函数的一般格式为: [X,Y]=meshgrid(x,y) 其中,x,y分别指向x轴向和y轴向的数据点,当x为n维向量,y为m维向量时,X,Y均为m*n 矩阵,X(i,j)和Y(i,j)共同指向平面上的一点,当x,y轴取同一向量时,可简写成 [X,Y]=meshgrid(x) 例:数学函数,定义在区域[-8,8]*[-8,8]上。在生成网格点后,计算网格点上的函数值。 x=-8:0.5:8; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R (3)网格曲面(mesh函数) mesh函数绘制三维空间上的网格曲面,如上例最后加上mesh(Z),生成一曲面。 mesh函数的其它格式为: mesh(X,Y,Z): X,Y,Z为同维数的矩阵。 mesh(X,Y,Z,C): C称为颜色矩阵。网格曲面的顶点对应于空间的顶点(X(i,j),Y(i,j),Z(i,j)),而网格曲面的网格线的颜色由C值根据当前的色谱来着色。这种调用形式还可以用来生成参数曲面片。 mesh(x,y,Z,C):其中,x和y是向量,Z和C是同维数的矩阵,且向量x的长度等于矩阵Z的列数,而向量y的长度等于矩阵Z的行数。在这种情况下,网格曲面的曲格顶点是(x(j),y(i),Z(i,j)),网格线的长度由矩阵C决定。 mesh(Z,C):Z和C都是m*n矩阵,该形式与mesh(x,y,Z,C)等价。 与mesh相关的另外两个函数是meshc和meshz,它们的调用形式与mesh相同。meshc函数可同时绘制出轮廓图(即等高线图)。meshz的作用除了生成与mesh相同的网和曲面之外,还在曲面下面加上一个长方体的台柱,使图形更加美观。 例:曲面图 [x,y]=meshgrid(-3:.125:3); z=peaks(x,y);c=ones(size(z)); figure(1) mesh(x,y,z,c),grid on title('多峰函数的网格曲线') 例: [x,y]=meshgrid(-8:0.5:8); r=sqrt(x.^2 + y.^2) + eps; /*加eps是为了防止出现0/0的情形*/ z=sin(r)./r; mesh(x,y,z); 例:曲面与等高线 x=-8:0.5:8; y=x; [X,Y]=meshgrid(x,y); R=sqrt(X.^2+Y.^2)+eps; Z=sin(R)./R subplot(2,2,1);meshc(Z) subplot(2,2,2);meshz(Z) 3.10 实曲面的绘制 实曲面就是对网格曲面的网格块(四边形片)区域进行着色的结果。MATLAB的函数surf函数可提供这种功能。它的调用方式与mesh相同,但mesh仅对网格线着色,网格线用黑色标出(可以修改)。而surf 是对网格片着色,绘制的是二维曲面。 例:用surf函数表现三维数据。 k=4; n=2^k-1; theta=pi*(-n:2:n)/n; phi=(pi/2)*(-n:2:n)'/n; X=cos(phi)*cos(theta); Y=cos(phi)*sin(theta); Z=sin(phi)*ones(size(theta)); colormap([0 0 0;1 1 1]);C=hadamard(2^k); surf(X,Y,Z,C); axis square 可以用shading函数来改变着色方式。 如:shading faceted (默认的着色方式,网格线为黑色); shading flat (网格线分块着色); shading interp (光顺性着色)。 网格块的内部像素的颜色由该片的四个顶点的颜色做双线性插值得出。 例:[x,y]=meshgrid(-3:.125:3); z=peaks(x,y);c=ones(size(z)); figure(1) shading faceted %% shading flat / interp surf(x,y,z,c),grid on title('多峰函数的网格曲面') surfc函数绘制二维曲面同时还绘制出轮廓图(即等高线图)。surfl函数能生成具有光照效应的表面,使图形更加美观。同时还可以指定三维坐标系的光源点坐标[x1,y1,z1],或光源方向的球面坐标值,即经度和纬度(仰角)向量[azimuth,elevation]。 例:用surfl指令创建一个图形,其中光源的方向为经度=-10度,纬度=50度。 surfl(peaks(200),[-10,50]); colormap(gray); shading flat 还有两个与meshc和meshz对应的函数surfc和surfz,这里不再详述。 3.11 等高线图形 MATLAB支持二维和三维等高线图形。函数contour和contour3被用来实现这种功能。它们将输入的矩阵变量M看作是定义在[1,m]*[1,n]上的函数,生成若干条常数值的等高线段。用户也可以指定等高线的条数、坐标系的比例以及某值上的等高线。 等高线的线型、顶点标记、颜色类型类似于plot函数定义。contour3适用于三维等高线的生成,调用方式与contour相同。 例:二维和三维等高线的生成。 contour(peaks,30) %生成二维等高线 % contour3(peaks,20) %生成三维等高线 3.12 改变视角view 函数view改变所有类型的二维和三维图形的图形视角。与z=0平面所成的方向角叫仰角,与x=0平 面的夹角叫做方位角,默认的三维视角方向仰角为30度,方位角-37.5为度。而默认的二维视角仰角为90度,方位角为0度。 函数view(az,el)和view([az,el])将视角改变到所指定的方位角az和仰角rl。 例:仰角和方位角的改变。 x=linspace(0,3*pi).? z=[sin(x) sin(2*x) sin(2*x)]; y=[zeros(size(x)) ones(size(x))/2 ones(size(x))]; %生成矩阵z,y subplot(2,2,1),plot3(x,y,z) grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(…默认视角:方位角=37.5,仰角=30?) view(-37.5,30) %将视角改变到所指定的方位角-37.5和仰角30 subplot(2,2,2),plot3(x,y,z) grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(…方位角旋转至 52.5度?) view(-37.5+90,30) %将视角改变到所指定的方位角52.5和仰角30 subplot(2,2,3),plot3(x,y,z) grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(…仰角变为60度?) view(-37.5,60) %将视角改变到所指定的方位角-37.5和仰角60 subplot(2,2,4),plot3(x,y,z) grid on ,xlabel(“X-axis”),ylabel(“Y-axis”),zlabel(“z-axis”) title(…方位角为0度,仰角为90度?) view(0,90) %将视角改变到所指定的方位角0和仰角90 3.13 透视效应hidden MATLAB在绘制图形时,在默认方式下,前面的图形会挡住后面的图形,即消去后面的隐藏线,可用命令hidden改变这种模式。 命令格式:hidden off hidden on 例:透视图形. subplot(1,2,1), mesh(peaks(20)+7); hidden on subplot(1,2,2), mesh(peaks(20)+7); hidden off 3.15 曲面的裁剪方法 因为曲面图不能做成透明,但在一些情况下可以很方便地移走一部分表面以便看到表面下面的部分。在MATLAB中,可以将要观察部分的数据置为特定的NaN来实现,由于NaN没有任何值,所有的作图函数都忽略NaN的数据点。即将曲面裁剪掉一部分。 例:利用NaN进行曲面裁剪 [x,y,z]=peaks(30); x1=x(1,:);y1=y(:,1); i=find(y1>0.8 & y1<1.2); j=find(x1>-.6 & x1<.5); z(i,j)=nan*z(i,j); surf(x,y,z) 3.16 四维表现和切片图slice 对于一般的定义在x,y,z坐标系上的四维可视化,可以用指令slice来实现。 为了实现三元函数r=f(x,y,z)的可视化表现,MATLAB提供了一个绘制三维物体切片图指令及与之配合的三维网格坐标生成指令。 [X,Y,Z]=meshgrid(x,y,z) % 三维网格坐标的生成 slice(X,Y,Z,V,xi,yi,zi,n) % 绘制三维物体切片图