1、 -794- 附录一 Matlab 入门 1 概论 常用的数学软件有 Maple, Mathematica, Matlab 等;常用的大型统计软件有 SAS,SPSS 等。下面我们简要地介绍一些 Matlab 的功能,应用范围及发展史。 Matlab 有五大通用功能:数值计算功能 (Numeric),符号运算功能 (Symbolic) (当要求 Matlab 进行符号运算时 ,它就请求 Malpe 计算并将结果返回到 Matlab 命令窗口 ),数据可视化功能 (Graphic),数据图形文字统一处理功能 (Notebook)和建模仿真可视化功能(Simulink)。 Matlab 在线性代数
2、,矩阵分析,数值及优化,数理统计和随机信号分析,电路与系统,系统动力学,信号和图像处理,控制理论分析和系统设计,过程控制,建模和仿真,通信系统,财政金融的众多领域的理论研究和工程设计中得到了广泛应用。 MATLAB 是 1984 年由美国 Mathworks 公司推向市场。该软件有三大特点:一是功能强大;二是界面友善,语言自然;三是开放性强 (仅 Mathworks 公司就推出了 30 多个应用工具箱 )。 Matlab 的版本目前已经发展到 Matlab7.4。 2 Matlab 简介 1 指令行的编辑 启动 Matlab 后,就可以利用 Matlab 工作。由于 Matlab 是一种交互式
3、语言,随时输入指令,即时给出运算结果是它的工作方式。 2*sin(0.3*pi)/(1+sqrt(5) ans=0.5000 (ans 是一个保留的 Matlab 字符串,它表示上面一个式子的返回结果,用于结果的缺省变量名。) 2. 入门演示 intro demo 3. 帮助 help %帮助总揽 help elfun %关于基本函数的帮助信息 help exp %指数函数 exp 的详细信息 lookfor 指令 当要查找具有某种功能但又不知道准确名字的指令时,help 的能力就不够了,lookfor 可以根据用户提供的完整或不完整的关键词,去搜索出一组与之相关的指令。 lookfor in
4、tegral %查找有关积分的指令 lookfor fourier %查找能进行傅里叶变换的指令 超文本格式的帮助文件 在 Matlab 中,关于一个函数的帮助信息可以用 doc 命令以超文本的方式给出,如: doc doc doc doc eig %eig 求矩阵的特征值和特征向量 pdf 帮助文件 4. 简单的矩阵输入 要直接输入矩阵时,矩阵元素用空格或逗号分隔;矩阵行用分号“; ”隔离,整个矩阵放在方括号“ ”里。 -795- A=1,2,3;4,5,6;7,8,9 说明:指令执行后,矩阵 A被保存在 Matlab 的工作间(workspace)中,以备后用。如果用户不用 clear指令
5、清除它,或对它进行重新赋值,那么该矩阵会一直保存在工作间中,直到本 Matlab 指令窗关闭为止。 矩阵的分行输入 A=1,2,3 4,5,6 7,8,9 5. 语句与变量 Matlab 语句有两种最常见的形式 i) 表达式 ii)变量=表达式 例1 表达式的计算结果 1996/18 ans=110.8889 例2 计算结果的赋值 s=1-1/2+1/3-1/4+1/5-1/6+. 1/7-1/8; 说明:三个小黑点是“连行号” ,分号“; ”作用是:指令执行结果将不显示在屏幕上,但变量 s 将驻留在内存中。若用户想看 s 的值,可键入以下命令: s (s= 0.6345) 特殊变量 ans
6、用于结果的缺省变量名 pi 圆周率 eps 计算机的最小数 flops 浮点运算次数 inf 无穷大 如 1/0 NaN 不定量 如 0/0 i(j) i=j= 1 nargin 所用函数的输入变量数目 nargout 所用函数的输出变量数目 realmin 最小可用正实数 realmax 最大可用正实数 6. 数据结构:向量、矩阵、结构数组和细胞数组 向量的共轭转置 z=1+j,2+pi*i,-sqrt(-1) z = 1.0000 - 1.0000i 2.0000 - 3.1416i 0 + 1.0000i 得到其共轭转置向量。 z. (非共轭转置向量) -796- 产生一个行向量 t=0
7、:0.1:10 %产生从 0 到10 的行向量,元素之间间隔为 0.1 t=linspace(n1,n2,n) %产生 n1 和n2 之间线性均匀分布的 n个数 (缺省n 时,产生 100 个数) t=logspace(n1,n2,n) (缺省n 时,产生 50 个点) who,whos,si ze 和length 是对提供工作空间变量信息很有用处的四个命令。 who 执行该命令可列出工作空间的所有变量; whos 显示所有的变量,变量的元素个数和所占的字节数等; size(a) 执行该命令可以得到矩阵 a 的行数与列数; length(a) 执行该命令后,屏幕上显示出向量 a的长度。如果 a
8、 是矩阵,则显示的参数为行数列数中的最大者。 矩阵的标号 A(m,n)表示矩阵 A 的第m 行,第n 列的元素; A(1:2,1:3)表示矩阵 A的从第一行到第二行,从第一列到第三列的所有元素; A(:) 可以得到一个长向量,该向量的元素是按列一一叠加在一起的。例如 a=1 2;3 4;a(: ) ans= 1 3 2 4 矩阵的下标也可以是向量。例如 b=a(x,y); 可以得到一个矩阵 b。a的行标来自向量 x,而列标来自向量 y。 例如,矩阵 a 有n 列,那末 b=a(:,n:-1:1) 将得到矩阵 b,它等于矩阵 a 按列的逆序排列。 特殊矩阵 i)单位矩阵 eye(m),eye(s
9、ize(a) 可以得到与矩阵 a 同样大小的单位矩阵, eye(m,n)可得到一个可允许的最大单位矩阵而其余处补 0。 ii)所有元素为 1 的矩阵 ones(n),ones(size(a),ones(m,n) iii)所有元素为 0 的矩阵 zeros(n),zeros(m,n) iv)空矩阵是一个特殊矩阵,这在线性代数中是不存在的。 例如: q= 矩阵 q 在工作空间之中,但它的大小为零。通过空矩阵的办法可以删去行与列。例如 a=rand(5); a(:,1:3)= 第一条指令执行后得到一个 55 的矩阵;第二条指令将矩阵 a的前三列删除。 v) 对角矩阵 当 v 是向量时,diag(v)
10、得到以 v 的元素为对角线上元素的对角矩阵; 当 v 是矩阵时,diag(v) 得到一个列向量,其元素为矩阵 v 对角线上的元素,diag(v,1)得到矩阵 v 对角线上移一行的元素组成的列向量,diag(v,-1)得到矩阵 v 对角线下移一行的元素组成的列向量。 -797- 字符串要用单引号。例如: disp(text string) % disp 显示命令 还有几个字符串命令可以作为文字说明和绘图标题说明等,如num2str,int2str,fprintf 和sprintf。同样,可以借助于 help命令了解它们的具体用法。 结构数组 有时需要将不同的数据类型组合成一个整体,以便于引用。这
11、些组合在一个整体中的数据是相互联系的。例如,一个学生的学号、姓名、性别、年龄、成绩、家庭地址等项都是和该学生有联系的。 下面简单介绍结构体的定义与引用。 i)结构数组的定义 定义结构数组可以采用两种方法:用赋值语句定义和用函数 struct 定义。 用赋值语句定义结构时,只要给出结构的属性赋值,Matlab 就会自动把该属性增加到结构中, 赋值时, 结构名和属性名用 “.” 分开。 例如, 下面三条语句将定义一个 11的结构数组,结构名为 student,有三个属性:name、num、test。该结构数组只有一个元素,在命令窗口中键入结构名 student,将显示该元素所有属性的属性值的特性。
12、 student.name=John Doe; student.num=123456; student.test=79 75 73;80 78 79;90 85 80; 再键入以下三行可给该结构数组增加一个元素。 student(2).name=Ann Lane; student(2).num=123422; student(2).test=70 76 73;80 99 79;90 85 80;80 85 86; 现在结构数组 student的维数为 21 。当结构数组的元素超过 1 个时,MATLAB 的显示信息中,不再显示不同属性的值,而只显示数组名、属性名和维数大小。 函数 struct
13、也可用来定义结构数组,其调用格式为: 结构数组名struct( 属性 1 ,属性值 1 , 属性 2 ,属性值 2 ,) ii)结构数组属性值的修改、设置和获取 结构数组一旦形成,就可取出数组中的某个元素并修改该元素的某个属性的值。以上面建立的 student 数组为例,命令 str=student(2).name 可取出第二个元素的 name 属性的值。 命令 n=student(2).test(4,2) 取出第二个元素 test 的值中第四行第二列上的数。 同理,可用命令 student(2).test(4,2)=0 修改第二个元素 test 的值中第四行第二列上的数的值。 关于结构数组有
14、表 1 中的函数。 表1 结构数组的有关函数 函数名 作用 struct 生成和转换为结构数组 fieldnames 查询结构数组的属性名 getfield 查询结构数组的属性值 setfield 设置结构数组的属性值 -798- rmfield 删除属性 isfield 检查是否为数组的属性 isstruct 检查数组是否为结构型 细胞数组 细胞数组也是 MATLAB 里的一类特殊的数组。在 MATLAB 里,由于有细胞数组这个数据类型,才能把不同类型、不同维数的数组组成为一个数组。 细胞数组的每一个元素可为类型不同、维数不同的矩阵、向量、标量或多维数组,所有元素用大括号括起来。如矩阵 A=
15、1 2 3 4;2 3 4 5;3 4 5 6,则命令 c=A,sum(A),sum(sum(A) 得到一个 31 的细胞数组。 关于细胞数组有表 2 中的函数。 表2 细胞数组的有关函数 函数名 作用 celldisp 显示细胞数组的内容 cell 生成细胞数组 cellplot 用图形方式显示细胞数组 num2cell 把数值型转换为细胞型 deal 输入和输出的匹配 cell2struct 把细胞数组转换为结构数组 struct2cell 把结构数组转换为细胞数组 iscell 检验数组是否为细胞型 i)细胞数组的生成 有两种方法可以生成细胞数组:用赋值语句直接生成;先用 cell 函数
16、预分配数组,然后再对每个元素赋值。 有两种方法可对元素赋值:一种方法采用数组元素的下标赋值。下面四句命令将建立一个 22 的细胞数组。 A(1,1)=1:5;6:10; A(1,2)=Anne cat; A(2,1)=3+7i; A(2,2)=0:pi/10:pi; 在大括号中, 逗号或者空格表示每行元素之间的分割, 分号表示不同行之间的分割。 另一种方法则把细胞数组的下标用大括号括起来,而所赋的值采用普通数组的形式。例如下面四句生成的细胞数组和上面所生成的完全一样。 A1,1=1:5;6:10; A1,2=Anne cat; A2,1=3+7i; A2,2=0:pi/10:pi; 命令 B=
17、cell(3,4) 创建一个 43 的细胞矩阵。 ii)细胞数组内容的查看 对于上面建立的数组 A, 在 Matlab 命令窗口键入变量名 A, 将显示数组的简要信息。用大括号 括起来的下标为细胞数组的第几个元素,用圆括号()括起来的下标为大-799- 括号 对应的某个元素的分量。如 A2,2(1),A4(1) 对上面的细胞数组显示的结果是一样的。 函数 celldisp 用来显示细胞数组的每个元素的值。 函数 cellplot 将画出细胞数组的每个元素的结构图。 当给已经定义的细胞数组下标范围外的元素赋值时,Matlab 自动扩维,对于没有赋值的元素,赋值为空矩阵。 7. 数学运算与函数 基
18、本代数运算操作 +,-,*,/,, 矩阵运算函数:求行列式(det),矩阵求逆(inv),求秩(rank) ,求迹(trace),求模(norm),d=eig(A)求矩阵 A的特征值,v,d=eig(A)求矩阵 A的特征向量和特征值,这里 v的列向量是对应的特征向量。 矩阵基本运算: AB, B/A, A.*B, A./B, A.B, A.B。 基本数学函数 常用的数学函数有 sin,cos,tan,abs,min, sqrt,log,log10,sign,asin,acos,atan,max,sum ,exp,fix等。具体使用方法请参看帮助 help。 常用的矩阵函数有 expm,logm
19、,sqrtm 和 funm,funm 函数可计算任何一个基本数学函数的矩阵函数。它可以表示为 fa=funm(a,fun) 式中,fun 可以是任意一个基本函数,如 sin,cos,log10 等。 多项式 任意多项式都可以用一个行向量来表示,即 n 维的向量 a 表示多项式)()1()2()1()(21naxnaxaxaxynn+=L,反过来,任意一个向量就可以作为多项式。 例如: p=1 6 11 -6; poly2sym(p,x) ans = x3-6*x2+11*x-6 求 43223+ sss 的根可用如下命令。 A=1 2 3 4;roots(A) i) poly 函数 p=pol
20、y(A), A 是一个 nn 的矩阵时, 此函数返回矩阵 A 的特征多项式 p, p是 1+n维向量;A 是向量时,此函数返回以向量中的元素为根的多项式。 ii) 多项式的数组运算 y=polyval(p,x) 计算多项式在 x 处的值,x 可以是矩阵或向量,此时函数计算多项式在 x 的每个元素处的值。 iii) 多项式的矩阵运算 y=polyvalm(p,x) 相当于用矩阵 x 代替多项式的变量来对矩阵而不是对数组进行运算,x 必须是方阵。例如: =4321A , IAAAp 23)(2+= 可采用如下的命令进行计算 p=1 3 2; -800- a=1 2; 3 4; polyvalm(p
21、,a) iv) 多项式的乘法和除法运算 w=conv(u,v) 此函数求多项式 u 和 v 的乘积,即求向量 u 和 v 的卷积。如果m=length(u),n=length(v),则w 的长度为m+n-1。 q,r=deconv(u,v) 此函数表示多项式u除以多项式v得到商多项式q和余数多项式 r,如果r的元素全部为零,则表示多项式 v可以整除多项式 u。 8. 绘图命令 二维图形 二维绘图的基本命令有 plot,loglog,semil ogx,semilogy 和 polar。它们的使用方法基本相同,其不同特点是在不同的坐标中绘制图形。plot 命令使用线性坐标空间绘制图形;loglo
22、g 命令在两个对数坐标空间中绘制图形;而 semilogx(或semilogy)命令使用 x轴 (或 y 轴) 为对数刻度, 另外一个轴为线性刻度的坐标空间绘制图形; polar使用极坐标空间绘制图形。 二维绘图命令 plot 为了适应各种绘图需要,提供了用于控制线色、数据点和线型的 3 组基本参数。它的使用格式如下: plot(x,y,color_point_linestyle) 该命令是绘制 y 对应x的轨迹的命令。y 与x 均为向量,且具有相同的元素个数。用字符串 color_point_linestyle 完成对上面 3个参数的设置。 线色 (r-red, g-green,b-blue
23、,w-white,k-black,i-invisible,y-yellow) ,数据点(.,o,x,+,*,S,H,D,V,=1); fplot(fun1,-3,3) 画等高线的函数 contour 在 Matlab 中,可以用 contour 命令绘制平面等高线,用 contour3 命令绘制空间等高线。 绘制平面等高线 contour 命令的具体使用格式为: contour(x,y,z,n) contour(x,y,z,v) contourf() 其中 x, y 为其横纵坐标值向量,如果 x 为 s 维, y 为 m 维,则 z 为 ms 维矩阵,为对应于坐标( x,y)的高度。参数 n
24、为整数,指定了绘出等高线的条数。参数 v 为向量,指定了在哪些高度绘出等高线,如只想在一个高度 z 绘出等高线,则 v=z, z。 contourf()命令的参数与 contour 命令完全相同,只是其绘出的等高线图将被自动填上颜色。 c=contour(x,y,z,n) c=contour(x,y,z,v) 上面 2 个命令用来计算所画等高线的 x, y 坐标值。 clabel(c) clabel(c,v) 上面 2 个命令用来标注计算的 c 阵处的高度值。 clabel(c)将把所绘等高线全部自动标注, clabel(c,v)将自动标注由向量 v 确定的若干条等高线的高度值。 例 10 c
25、lc;clf; x=0:400:5600; y=0:400:4800; z=370,470,550,600,670,690,670,620,580,450,400,300,100,150,250; 510,620,730,800,850,870,850,780,720,650,500,200,300,350,320; 650,760,880,970,1020,1050,1020,830,800,700,300,500,550,480,350; 740,880,1080,1130,1250,1280,1230,1040,900,500,700,780,750,650,550; 830,980,1
26、180,1320,1450,1420,1400,1300,700,900,850,810,380,780,750; 880,1060,1230,1390,1500,1500,1400,900,1100,1060,950,870,900,930,950; 910,1090,1270,1500,1200,1100,1350,1450,1200,1150,1010,880,1000,1050,1100; -804- 950,1190,1370,1500,1200,1100,1550,1600,1550,1380,1070,900,1050,1150,1200; 1430,1450,1460,1500
27、,1550,1600,1550,1600,1600,1600,1550,1500,1500,1550,1550; 1420,1430,1450,1480,1500,1550,1510,1430,1300,1200,980,850,750,550,500; 1380,1410,1430,1450,1470,1320,1280,1200,1080,940,780,620,460,370,350; 1370,1390,1410,1430,1440,1140,1110,1050,950,820,690,540,380,300,210; 1350,1370,1390,1400,1410,960,940,
28、880,800,690,570,430,290,210,150; hold on c=contourf(x,y,z,10);clabel(c) text(0,800, leftarrow 起点 ,fontsize,15,color,r) text(4000,2000, leftarrow 居民点 ,fontsize,15,color,r) text(2000,4000, leftarrow 矿区 ,fontsize,15,color,b) line(2400,4800,2400,0) figure surf(x,y,z),view(50,30),hold on text(0,800,680,
29、,fontsize,15,color,r) text(0,600,880,起点 ,fontsize,15,color,r) text(4000,2000,950, ,fontsize,15,color,r) text(4200,2000,1150,居民点 ,fontsize,15,color,w) text(2000,4000,1320, leftarrow 矿区 ,fontsize,15,color,b) 3 程序设计 1关系和逻辑运算 关系运算符有以下 6 种 ,=,=,=, 关系成立时结果为 1,否则为 0。 逻辑运算符有 ,xor 分别代表逻辑运算中的与、或、非、异或。0 的逻辑量为“
30、假” ,而任意非零数的逻辑量为“真” 。 例11 a=1,2,3,4; b=0,1,0,2; s1=a0,2 b=zeros(1,5) s1=find(a),s2=find(b) i,j,v=find(a) 此函数返回矩阵 a 的非零元素的行和列的标识,其中 i 代表行标,而 j 代表列标,同时,将相应的非零元素的值放于列向量 v 中。 例13 a=0,5;0,7 i,j,v=find(a) 例 14 找出a 中不等于7的元素的位置。 a=0,5;0,7 s=find(a=7) 例 15 将矩阵 a 中等于7 的元素的值换成矩阵 c中相应位置上的元素。 a=0,5;0,7 c=rand(2,2
31、) a(find(a=7)=c(find(a=7) 例 16 将矩阵 a 中等于0 的元素删除。 a=1,0,5;0,2,7 a(find(a=0)= b=reshape(a,2,2) b(:,2)= 或者使用命令 nonzeros实现,程序如下 a=1,0,5;0,2,7 a=nonzeros(a) 3流程控制语句 计算机程序通常都是从前到后逐条执行的。但往往也需要根据实际情况,中途改变执行的次序,称为流程控制。Matlab 设有4种流程控制的语句结构,即 if 语句、while 语句、for 语句和 switch 语句。 i)if 语句 根据复杂程度,if 语句有 3 种形式 if 表达式
32、 语句组 a, end if 表达式1 语句组a, else 语句组b, end if 表达式1 语句组a, elseif 表达式2 语句组b,else 语句组c,end ii)while 语句 while 语句的结构形式为 while 表达式 语句组, end 例 17 求 Matlab 中的一个充分大的实数。 设定一个数 x,让它不断增大,直到 Matlab 无法表示它的值,只能表示为 Inf为止。 x=rand; while x=Inf x1=x;x=2*x; end -806- x1 iii)for 语句 for 语句的结构形式为 for k=初值:增量:终值 语句组a,end iv)
33、switch语句 switchcaseotherwise 语句可用来实现均衡的多分支语句,其基本语句结构可表示为 switch 表达式(标量或字符串) case 值1 语句组1 case 值2 语句组2 otherwise 语句组n end 例 18 判断输入数 n 的奇偶性。 n=input(n=) switch mod(n,2) case 1,a=奇 case 0,a=偶 otherwise,a=非整数 end 4M文件与M函数 由 Matlab 语句构成的程序文件称作 M 文件,它将 m 作为文件的扩展名。M 文件可分为程序文件和函数文件两种。 程序文件一般是由用户为解决特定的问题而编制
34、的程序, 函数文件也称为子程序,它必须由 Matlab 程序来调用。函数文件往往具有一定的通用性,并且可以进行递归调用。 i)程序文件 程序文件的格式特征如下: (1)前面的若干行通常是程序的注释,每行以“”开始,当然注释可以放在程序的任何部分。注释可以是汉字,注释是对程序的说明,它增加了程序的可读性。在执行程序时,Matlab 将不理会“”后直到行末的全部文字。 (2)然后是程序的主体。如果文件中有全局变量,即子程序和主程序共用的变量,应在程序的起始部分注明。其语句是 global 变量名1 变量名2 (3)整个程序应按 Matlab 标识符的要求起文件名,文件名不能以数字开始,不允许用汉字
35、。 ii)函数文件 函数文件是用来定义子程序的。它与程序文件的主要区别有 3 点: (1)由 function 起头,后跟的函数名要与文件名相同。 (2)有输入输出变量,可进行变量传递。 (3) 除非用global 声明, 函数中的变量均为局部变量, 不保存在工作空间中。 例 19 编写求阶乘的函数。 -807- function y=fac(n); if n1) x=sin(t);y=cos(t); axis square plot(x,y,b) n=length(t); -812- h=line(color,red,marker,diamond,erasemode,xor); i=1;j=1; while 1 set(h,xdata,x(i),ydata,y(i) pause(0.01) i=i+1;j=j+1; if in i=1; end if j2*n break end end 习题 1求方程 0123=+ xxx 的根。 2产生一个随机的 3 阶矩阵,并求该矩阵的逆矩阵,特征值与特征向量和行列式的值。 3存储工作间变量 x,y,z 到文件data1.mat,再在程序中调用变量 x,y,z。 4产生 20个随机数,再把这 20 个随机数存放在纯文本文件中。