1、MatLab 讲义 2002 年 9 月版1MATLAB 讲义第一章 MATLAB 系统概述1.1 MATLAB 系统概述MATLAB(MATrix LABoratory)矩阵实验室的缩写,全部用 C 语言编写。特点:(1)以复数矩阵作为基本编程单元,矩阵运算如同其它高级语言中的语言变量操作一样方便,而且矩阵无需定义即可采用。(2)语句书写简单。(3)语句功能强大。(4)有丰富的图形功能。如 plot,plot3 语句等。(5)提供了许多面向应用问题求解的工具箱函数。目前,有 20 多个工具箱函数,如信号处理、图像处理、控制系统、系统识别、最优化、神经网络的模糊系统等。(6)易扩充。1.2 M
2、ATLAB 系统组成(1)MATLAB 语言MATLAB 语言是高级的矩阵、矢量语言,具有控制流向语句、函数、数据结构、输入输出等功能。同时 MATLAB 又具有面向对象编程特色。MATLAB 语言包括运算符和特殊字符、编程语言结构、字符串、文件输入/输出、时间和日期、数据类型和结构等部分。(2)开发环境MATLAB 开发环境有一系列的工具和功能体,其中大部分具有图形用户界面,包括 MATLAB 桌面、命令窗口、命令历史窗口、帮助游览器、工作空间、文件和搜索路径等。(3)图形处理图形处理包括二维、三维数据可视化,图像处理、模拟、图形表示等图形命令。还包括低级的图形命令,供用户自由制作、控制图形
3、特性之用。(4)数学函数库有求和、正弦、余弦等基本函数到矩阵求逆、求矩阵特征值和特征矢量等。MATLAB 数学函数库可分为基本矩阵和操作、基本数学函数、特殊化数学函数、线性矩阵函数、数学分析和付里叶变换、多项式和二重函数等。(5)MATLAB 应用程序接口(API)MATLAB 程序可以和 C/C+语言及 FORTRAN 程序结合起来,可将以前编写的 C/C+、FORTRAN 语言程序移植到 MATLAB 中。1.3 MATLAB 的应用范围包括:MATLAB 的典型应用包括: 数学计算 算法开发 建模、仿真和演算 数据分析和可视化 科学与工程绘图 应用开发(包括建立图形用户界面)以矩阵为基本
4、对象第二章 Matlab 基础2.1 MATLAB 快速入门(1)搜索路径搜索路径也被看作是 MATLAB 的路径,其包含的文件被认为在路径上。搜索路径设置存放在文件pathdef.m 中,称为当前目录,当要在 MATLAB 中打开一个文件时,就以当前目录为开始点。MatLab 讲义 2002 年 9 月版2当输入一变量 value 时,MATLAB 的搜索路径次序:value 是否为变量value 是否为内部函数当前目录中是否存在 value.m 文件搜索路径上是否存在 value.m 文件path 函数可以控制 MATLAB 的目录搜索路径,主要使用的格式:path 显示当前的搜索路径p=
5、path 把当前的搜索路径存到字符变量 P 中path(newpath) 设置路径为newpathpath(path,newpath) 向当前路径添加一个新目录addpath 函数向 MATLAB 的搜索目录中添加一个新目录。addpath 路径名 path(path,路径名):增加搜索路径rmpath 函数从 MATLAB 的搜索路径删除一个目录。rmpath 路径名:删除路径还可以利用菜单:File-setpath(路径浏览器)what:显示出搜索路径上的文件名what 路径名:路径名中的文件名type value:显示变量内容edit 文件名:对 m 文件进行编辑 (2)工作空间(Wor
6、kspace)工作空间是一个重要而且比较抽象的概念,它是指运行 MATLAB 程序或命令所生成和存储在内存中的所有变量和 MATLAB 提供的常量构成的集合。通过使用函数、运行 M 文件和装载保存的工作空间,可以向工作空间增加变量。 save 保存整个工作空间或一部分变量,使用方式:save workspace as 文件名或save 文件名 变量名 load 恢复工作空间,使用方式:load workspaceload 文件名 工作空间浏览器:File-Show Workspace 还有一组命令来管理这些变量。who,whos:显示出工作空间中的变量列表。clear 变量名:清除变量(3)M
7、ATLAB 命令窗口 输入命令和输出结果。如输入:help 函数名a=62.2 矩阵、变量、运算和表达式(1)矩阵的输入A直接输入:注意:(1)行元素间用空格或逗号(, )隔开;(2)行与行之间用分号(;)或回车;(3)整个元素列表用括起。直接输入的矩阵为一全局变量,一直保存在内存中。例: a=1 2 3;4 5 6a=1 2 34 5 6a=1,2,3;4,5,6;7,8,9 a=1 2 3; 4 5 6; 7 8 9MatLab 讲义 2002 年 9 月版3矩阵元素:可以灵活地描述矩阵元素, 矩阵元素 ai,j 按列存放通过下标单独对元素赋值例:a(1,1)=1,a(3,2)=a(1,1
8、) 得到a =1a =1 00 00 1即自动形成一个 3 行 2 列矩阵,对未赋值的元素充值 0。 矩阵的元素可以用任意形式的表达式例:算术表达式x=-1,sqrt(5),(2+7)4x =1.0e+003 *-0.0010 0.0022 6.5610 大矩阵可以用小矩阵作为元素例:a=1 2;3 4b=a a+5;a-5 zeros(size(a)例:A=1,2,3;4,5,6A =1 2 34 5 6B=A;7,8,9B =1 2 34 5 67 8 9 可以从矩阵中抽取某些元素构成新矩阵C=A(1:2,:)C =1 2 34 5 6例:a=3,4,5;6,7,8b=+2,4*5,6c=
9、sin(0.5*pi),sqrt(4),0d=a;b;c 复数的表示MATLAB 支持复数的运算,复数的虚部用 i 或 j 表示。例:a=1+2i 或 a=1+2j 二者表示的结果一样。复数可以直接运算,例:a=3+4i;b=5+6ja+b输出:ans=8.0000+10.0000i复数运算的一些常用函数:abs 返回复数的模angle 返回复数的相角conj 返回共轭复数imag 返回复数的实部MatLab 讲义 2002 年 9 月版4real 返回复数的虚部B.用语句或函数产生:a=randn(5,5) 产生正态分布 5*5 的随机矩阵。C.用 M-文件或外部数据文件产生:M-文件是一个
10、以.m 为后缀的文本文件,文件内容为一系列 MATLAB 命令,在 MATLAB 环境下键入该文件名(不包括后缀) ,文件中的全部命令会依次逐个执行;M-文件名(不包括后缀)相当于一个宏命令.例如:一个名为 magik.m 的文件包含了如下的内容, (假设 magik.m 在当前目录下)A = 16.0 3.0 2.0 13.05.0 10.0 11.0 8.09.0 6.0 7.0 12.04.0 15.0 14.0 1.0 在 Matlab 环境下执行如下命令:magikAA =16 3 2 135 10 11 89 6 7 124 15 14 1 D.用矩阵编辑器创建和修改矩阵:使用 F
11、ile-Show workspace(2)矩阵运算运算符 +,-,*,/(右除),(左除) 和(幂)。右除:C=A/B 即 C 满足 CB=A,当 B 可逆时,A/B=AB-1 左除:C=AB 即 C 满足 AC=B,当 A 可逆时,AB=A-1B 幂 An = A*A; A 必须是方阵。例:矩阵的加减法:a=1:3;4:6;7:9b=a; c=a+b; c=a-b注:矩阵相加减必须有相同的维数。例:矩阵的点乘运算,运算时矩阵必须为方阵,且只能与数字运算。d=a*b 必须符合 m*n 与 n*l 的结构。d=a.*b 矩阵的点乘运算例:(左除):AB=inv(A)*B,其中 inv(A)表示
12、A 逆阵,例如求解 AX=B。A=1 0 0;0 4 0;0 0 9;B=1 2 3;0 1 0;0 1 1;X=AB/(右除): A/B=A*inv(B),例如求解 XA=B。X=B/A(3)变量与表达式 Matlab 的赋值语句有两种形式:其一为:=表达式;其二为:表达式,将表达式的值赋于一个自动定义的变量 ans。注:A:如果以;结尾,则不显示计算结果,否则显示计算结果。B:除保留字外,变量可以用字母开头,后跟 19 个字母或数字。变量名区分大小写,变量使用时不需要先定义,也不必定义变量的类型。 可以用 who 或 whos 来显示已定义的变量例如:whoYour variables a
13、re:A B C a ans MatLab 讲义 2002 年 9 月版5whosName Size Bytes ClassA 2x3 48 double arrayB 3x3 72 double arrayC 2x3 48 double arraya 3x2 48 double arrayans 1x1 8 double arrayGrand total is 28 elements using 224 bytes 一些常用的变量pi 3.14159265 / 值i sqrt(-1 ) /虚数单位j same as i eps floating-point relative precisio
14、n, 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/0r=inf1/rans=0(4)矩阵的其他简单运算:A: 矩阵转置inv(A):A-1sum(A):得到一个行向量,其元素为 A 的每一列的和a=1 2 3;4 5 6sum(a)
15、 sum(a)diag(A):得到一个列向量,其元素为 A 的对角元sum(diag(a)冒号(:)运算符:a:b:c:生成一个由等差数列构成的行向量 X,X(i+1)-X(i)=b例:0:pi/4:pians =0 0.7854 1.5708 2.3562 3.1416如果省略 b,则等差数列的公差为 1a=0:0.05:1x=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: 矩阵左右翻转。f
16、lipud: 矩阵上下翻转。稀疏矩阵的存储:sparse(A):用于把完全矩阵压缩为稀疏矩阵。A=0,1,0,0;0,3,0,4;5,0,0,0;0,0,0,7sparse(A)ans=(3,1) 5(1,2) 1(2,2) 3(2,4) 4MatLab 讲义 2002 年 9 月版6(4,4) 7sparse(i,j,u):函数直接造成稀疏矩阵,i,j 为向量分别对应行号和列号,u 也为向量,存储非元素的值.i=1,2,2,3,4j=2,2,4,1,4u=1,3,4,5,7A=sparse(i,j,u)full 函数把稀疏矩阵还原为完全矩阵。(5)数组及其运算:数组可以看作是行向量,实质为阵
17、列运算。是元素对元素的运算,用句号(.)来区别。数组和矩阵之间的区别在于运算规则不同,矩阵运算由线性代数规则来定义。运算符:+,-和.*, ./, .,.A.*B:A 与 B 对应的元素相乘A.B:B 的元素除以 A 的相应元素A./B: A 的元素除以 B 的相应元素A.B:A 的元素为底,B 的相应元素为幂的数组如:a=1:3;4:6;7:9b=a; c=a+b; c=a-b查看下列运算的结果:a*b a.*b a/b a./b ab a.b ab(指数和底数均为矩阵,无法求解) a.b a a.2.3 基本数学函数abs(绝对值或复数模)sqrt (平方根)real(复数的实部)imag
18、 (复数的虚部)conj(复数的共轭)round (舍入为最接近的整数) /round(-0.5)=-1 round(0.4)=0fix (向 0 方向舍入为整数) /fix(0.99)=0 fix(1.01)=1floor (向负无穷大舍入为整数) /floor(-0.5)=-1 floor(0.5)=0ceil (向正无穷大舍入为整数) /ceil(-0.5)=0 ceil(0.6)=1sign (符号函数)rem(x,y) (取余数函数) /得到 x/y 的余数,rem(11,4)=3sin cos tan asin atan /三角函数都是面向阵列中的元素操作,角度单位均为弦度。ata
19、n2(y,x) /-pi 五角星标记 p六边形标记 h注:1.连接节点的线型如果空缺则表示点与点之间没有直线相连;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 onpcolor(x,y,z)shading interp其中:peaks:根据 Gauss 分布(
20、正态分布)得到 3 个 49 阶矩阵contour:用相同的颜色画 20 条等高线,pcolor:将(x,y)点上的颜色设置成 zshading 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 onplot(x,y1,yo,x,y2,mx,x,y3,c+,x,y4,rs);MatLab 讲义 2002 年 9 月版13plot(x,y5,gh,x,y6,bd,x,y7,w0.8 figure(position,100 100 size(
21、RGB,2), size(RGB,1);image(RGB);set(gca,position,0 0 1 1 );例:load clownimwrite(X,map,clown.bmp);3.19 动画制作用 MATLAB 产生动画序列有二种方法:第一种方法是先保存多幅不同的图片,然后连续回播;第二种方法是连续不断地擦除并重画屏幕对象,在重画时屏幕对象不断变化,实现动画效果。这二种方法各有优缺点。前者适于来不及快速重画的场合,它只是回放预先准备的画面。后者用到了画、擦、重画技术,适于表现精度不高能够快速重画的场合。例 1:使用 moviein 函数建立动画图形。axis equalm=mov
22、iein(8);set(gca,nextplot,replacechildren)for j=1:8plot(fft(eye(j+8)m(:,j)=getframe;endset(gca,nextplot,replacechildren)MatLab 讲义 2002 年 9 月版23movie(m,10)例 2:h = uicontrol(style,slider,position,.10 50 20 300,Min,1,Max,16,Value,1)for k = 1:16plot(fft(eye(k+16)axis equalset(h,Value,k)M(k) = getframe(gc
23、f);end例:使用擦除模式绘制动画图形。a=-8/3 0 0; 0 -10 10; 0 28 -1; y=35 -10 -7;h=0.01;p=plot3(y(1),y(2),y(3),.,erasemode,none,markersize,5); axis(0 50 -25 25 -25 25); hold onfor i=1:4000a(1,3)=y(2); a(3,1)=-y(2);ydot=a*y; y=y+h*ydot;set(p,Xdata,y(1),Ydata,y(2),Zdata,y(3)drawnowi=i+1;end第四章 控制流4.1 关系运算:MATLIB 有六种关系
24、运算符: = = = 结果 1 表示 true, 0 表示 false。其中 =只用于操作数的实部比较,= =用于比较实部和虚部。A.当两个变量是标量时,a 和 b 的关系成立,结果为 1,否则结果为 0。B.当比较 a 和 b 是两个维数相同的数组时,按相同位置比较,结果是一个维数和 a 相同的数组,其元素由 1 和 0 组成。C.当比较的一个是数组 a,一个是标量 b 时,则把标量 b 和数组 a 的每一个元素按标量关系逐个比较,结果是一个维数和 a 相同的数组,其元素由 1 和 0 组成。如:a=rand(5);b=ac=a=b;c=abc=a1;c=a0;c=a0.5x=(1:10);
25、t=x54.2 逻辑运算:|(或), 0 0.001xans=0 01 0y=1 0;1 0MatLab 讲义 2002 年 9 月版24z1=xfor i=1:nfor j=1:nif i=ja(i,j)=2;elseif min(i,j)=1a(i,j)=1;elsea(i,j)=0;endendenddisp(The matrix A is);disp(a)执行时:The matrix A is2 1 1 11 2 0 01 0 2 01 0 0 2例:(test1.m)for i=1:mfor j=1:na(i,j)=1/(i+j-1);endendMatLab 讲义 2002 年 9
26、 月版26例:for i=9.8:3:-9iend执行时:i=9.800 i=6.800 3.800 i=0.800 i=-2.200 i=-5.200 i=-8.200例:s=abcdefghijkfor i=siend%i 分别等于 s 中和每一个字符。例:c=aaa ,bbb,cccfor i=ciendi=aaa i=bbb i=ccc例:在循环中,可以改变循环变量的值,但它不会改变循环的次数.r=1for k=1:19k=k+1;r=r*k;end例:可利用数组(阵列)任意指定循环变是的值.(ex25.m)varx=7 3 10 5;vary=zeros(size(v);k=0;fo
27、r x=varxk=k+1vary(k)=x.2;enddisp(v,w)例:(ex31.m)求 100-200 之间的素数。for m=101:2:200k=fix(sqrt(m);for i=2:k+1if rem(m,i)=0break;endendif i=k+1disp(m)endend4.5 while-end 循环 不定次数重复的循环执行语句。格式:while 循环体end例:求 1000 以下的菲波纳契数(ex26.m)f=1 1;i=1;while f(i)+f(i+1) 0.1a=a/2;end4.6 switch-end 语句:情况切换语句,case 语句中可以采用多个值
28、。语句格式:switch (变量或表达式)case v1语句case v2语句.otherwise语句end例: switch (rem(n,4)=0) + (rem(n,2)=0)case 0case 1case 2otherwiseerror(This is impossible)end例:switch var2case -2,-1disp(var2 is negative one or two)case 1,2,3otherwisedisp(var2 is other value)end4.7 break 语句:一个跳出循环的命令,导致最内层的 while,for,if 语句终止。例:(
29、test3.m)a = 0; fa = -inf;b = 3; fb = inf;while b-a eps*bx = (a+b)/2;fx = x3-2*x-5;if fx = 0breakMatLab 讲义 2002 年 9 月版28elseif sign(fx) = sign(fa)a = x; fa = fx;elseb = x; fb = fx;endendx4.8 trycatch 语句用于捕获程序运行中出现的错误,语法如下:try 语句,.语句,catch 语句,.语句 end在正常情况下,程序只执行 try 和 catch 之间的语句,在执行上述语句发生错误时,程序将执行cat
30、ch 和 end 之间的语句,在这里可以利用 lasterr 获得错误信息进行处理,如再发生错误,除非嵌套了另一个 try.catch,否则程序将中断执行。4.9 return 语句return 语句终止当前的命令序列,把控制返回到调用函数或键盘。4.10 输入/输出语句 获得用户输入 input:显示一段信息,并读取用户输入。语法:x=input(提示信息,“输入类型“),缺省为 double 型。例:a=input(Please input a member)a=input(Please input a char,s) 暂停执行,等待用户按键 pause:程序暂停执行。语法:pause(n
31、)pause其中:n 为暂停的秒数。 建立完整的图形界面:菜单输入函数 menu。例:(ex27.m)s=menu(color selection,red,greed,blue,yellow,black)switch(s)case 1scolor=red;case 2scolor=green;case 3scolor=blue;case 4scolor=yellow;case 5scolor=blue;otherwisedisp(error);end scolor运行结果:MatLab 讲义 2002 年 9 月版29 输出函数 print,printopt4.11 自定义函数:用 M 函数自
32、定义函数,函数 M 文件必须以函数的名称来作为文件名,M 文件的格式如下:=()自变量和因变量都可以是矩阵或几个矩阵。M 文件的第一行包括 function,该文件就是函数文件,函数和命令文件的区别是:命令文件的变量用完后保存在内存,而函数文件文件内定义的量仅在函数文件内部起作用。函数文件有多个输出变量时,用括起,有多个输出变量时,用()括起。例:(quroot.m)function x=quroot(a)if abs(a(1) epsd=a(2)2-4*a(1)*a(3);if d = 0e=sqrt(d);f=2*a(1);x(1)=(-a(2)+e)/f;x(2)=(-a(2)-e)/f
33、;endelseif abs(a(2) epsx=-a(3)/a(2);elseerror(coefficient error!)end函数调用为:a=1 2 1x=quroot(a)x=-1 -1/*子函数调用*/function mean, stdev = stat(x)n=length(x);mean = avg(x,n);stdev = sqrt(sum(x-avg(x,n).2)/n);function mean = avg(x,n)MatLab 讲义 2002 年 9 月版30mean = sum(x)/n;在函数文件中可以包含多个函数,其中第一个函数称为主函数,其函数名与文件名相
34、同,它可以由其它文件引用,其它函数称为子函数,它只能由函数中的主函数和其它子函数引用。函数中有两个永久变量nargin,nargout 表示引用函数时给出的输入变量数和输出变量数。function c=testrg1(a,b)if(nargin=1)c=a.2;else (nargin=2)c=a*b;end输入一个变量时,计算这一变量的平方数输入二个变量时,计算这两个变量的积。函数的递归调用,在调用一个函数的过程中又出现直接或间接地调用该函数本身。例:求 n!(ex33.m)function y=ex33(n) %求 n!if n0error(n is smaller them 0)retu
35、rnendif n=0|n=1y=1elsey=n*ex33(n-1);end4.12 全局变量 局部变量和全局变量:函数工作空间中,变量有三类:(1)由调用函数传递输入和输出数据的变量;(2)在函数内部临时产生的变量(局部变量) ;(3)由调用函数空间,基本工作空间或其它函数工作空间提供的全局变量。global:让不同的函数访问同一个变量只要在函数中:global 变量名;% 该变量为全局变量function h = falling(t)global GRAVITYh = 1/2*GRAVITY*t.2;例:(ex28.m)对于函数 z=(x-1) 2+(y+1) 2。编写相应的函数文件,其中 和 采用全局变量进行参数传递。global alpha betax=0:0.02:2;y=-2:0.02:0;X,Y=meshgrid(x,y);subplot(2,2,1);alpha=1;beta=1;z=fun1(X,Y);mesh(z);subplot(2,2,2);alpha=2;beta=1;z=fun1(X,Y);mesh(z)subplot(2,2,3);alpha=1;beta=2;