第二章 MATLAB软件使用入门
MATLAB是MATrix LABoratory (矩阵实验室)的缩写,是由美国MathWorks公司于20世纪80年代初推出的一套以矩阵计算为基础的、适合多学科、多种工作平台的功能强劲的大型软件.MATLAB将数值计算、可视化和编程功能集成在非常便于使用的环境中,具有编程效率高、用户使用方便、扩充能力强、移植性好等特点.经过MathWorks公司的不断完善,目前MATLAB已经发展成为国际上最优秀的高性能科学与工程计算软件之一.
§2.1 MATLAB简介
一、MATLAB的工作环境
假定在您的计算机里已经安装了MATLAB7.0,在Windows桌面上就会出现MATLAB7.0的图标.双击此图标,进入MATLAB的工作界面.MATLAB7.0的工作界面主要由菜单、工具栏、命令窗口、工作空间管理窗口、命令历史窗口和当前目录窗口组成.
1、菜单和工具栏
MATLAB的菜单和工具栏界面与Windows程序的界面类似,只要稍加实践就可以掌握其功能和使用方法.
2、命令窗口(Command Window)
MATLAB命令窗口是用来接受MATLAB命令的窗口.在命令窗口中直接输入命令,可以实现显示、清除、储存、调出、管理、计算和绘图等功能.MATLAB命令窗口中的符号“>>”为运算提示符,表示MATLAB处于准备状态.当在提示符后输入一段程序或一段运算式后按回车键,MATLAB会给出计算结果并将其保存在工作空间管理窗口中,然后再次进入准备状态.
在命令窗口中实现管理功能的常用命令有: >>cd >>dir >>clc >>clf >>quit(exit) >>type test >>delete test >>which test >>what
显示当前工作目录;
显示当前工作目录或指定目录下的文件; 清除命令窗口中的所有内容; 清除图形窗口; 退出MATLAB;
在命令窗口中显示文件test.m的内容 删除文件test.m; 显示test.m的目录;
显示当前目录或指定目录下的M、MAT、MEX文件.
为了便于对输入的内容进行编辑,MATLAB提供了一些控制光标位置和进行简单编辑的一些常用编辑键,掌握这些命令可以在输入命令的过程中起到事半功倍的效果.
↑ ← home del
调用上一行; 光标左移一个字符; 光标置于当前行首; 删除光标处的字符;
↓ → end backspace
调用下一行; 光标右移一个字符; 光标置于当前行尾; 删除光标前的字符.
在以上按键中,反复使用“↑”,可以调出以前键入的所有命令,进行修改、计算. 3、工作空间管理窗口(Workspace)
工作空间管理窗口显示当前MATLAB的内存中使用的所有变量的变量名、变量的大小和变量的数据结构等信息,数据结构不同的变量对应着不同的图标.
在命令窗口中,实现变量的显示、清除、储存和调出的命令如下: >>who >>whos >>whos x >>disp(x) >>clear >>clear x >>save 文件名
显示当前工作空间中的所有变量名;
显示当前工作空间中的所有变量的变量名、变量的大小和数据类型; 显示工作空间中的变量x的大小、数据类型; 显示变量x的内容; 清除工作空间中的所有变量; 清除工作空间中的变量x
把工作空间中的变量保存在当前MATLAB目录下产生的一个扩展名为mat的文件中;
>>load 文件名
把该mat文件中的变量调入到MATLAB的内存中.
4、命令历史窗口(Command History)
命令历史窗口显示所有执行过的命令.在默认设置下,该窗口会保留自MATLAB安装后使用过所有命令,并表明使用的时间.利用该窗口,一方面可以查看曾经执行过的命令;另一方面,可以重复利用原来输入的命令,这只需在命令历史窗口中直接双击某个命令,就可以执行该命令.
5、当前目录窗口(Current Directory)
当前目录窗口显示当前目录下所有文件的文件名、文件类型和最后修改时间.
二、搜索路径与扩展
当MATLAB调用函数或执行程序文件时,对函数或程序文件的搜索,都是在其搜索路径下进行的.如果用户调用的函数在搜索路径之外,MATLAB会认为此函数并不存在.一般情况下,MATLAB系统的函数(包括工具箱函数)都在系统默认的搜索路径之中,但是用户编写的函数可能没有保存在搜索路径中.要解决这个问题,只需将函数或程序所在的目录扩展成MATLAB的搜索路径即可.
在MATLAB命令窗口中输入editpath命令或pathtool命令或通过MATLAB窗口中“File→Set Path”菜单,都可以进入“设置搜索路径”对话框,通过该对话框可以为MATLAB添加或删除搜索路径.
三、MATLAB的帮助系统
MATLAB为用户提供了非常完善的帮助系统,例如在线帮助、帮助窗口以及MATLAB演示等.通过使用帮助菜单或在命令窗口中输入帮助命令,可以很容易地获得MATLAB的帮助信息,进一步学习MATLAB.
1、命令窗口查询帮助系统
在命令窗口查询帮助系统最常用的命令是help.通过help命令,可以在命令窗口获得在线帮助.调用格式如下:
help 在命令窗口列出所有主要的基本帮助主题 help / 在命令窗口列出所有的运算符和特殊字符
help (函数名) 在命令窗口列出该函数的M文件的描述及用法,这是MATLAB中最常用的获取帮助信息的方式,例如 >> help sqrt
SQRT Square root.
SQRT(X) is the square root of the elements of X. Complex results are produced if X is not positive.
See also sqrtm.
Overloaded functions or methods (ones with the same name in other directories) help sym/sqrt.m
Reference page in Help browser doc sqrt
2、联机帮助系统
直接单击MATLAB主窗口的“?”按钮或选定Help菜单的前4项中的任意一项或在命令窗口中执行helpwin、helpdesk或doc命令都可以运行帮助窗口,进入MATLAB的联机帮助系统.
帮助向导页面包含4个页面,分别是帮助主题(Contents)、帮助索引(Index)、查询帮助(Search)以及演示帮助(Demos). 如果知道需要查询的内容的关键字,一般可以选择Index或Search模式来查询;只知道需要查询的内容所属的主题或是只是想进一步了解和学习某一主题,一般可以选择Contents或Demos模式来查询.
3、联机演示系统
选择MATLAB主窗口菜单的“Help→Demos”选项或在命令窗口输入demos或直接在
帮助页面上选择Demos选项都可以进入联机演示系统.通过联机演示系统,用户可以直观、快速地学习MATLAB某个工具箱的使用方法,它是有关的参考书籍不能替代的.
§2.2 变量与函数
一、变量
变量是任何程序设计语言的基本要素之一,MATLAB语言当然也不例外.与一般常规的程序设计语言不同的是,MATLAB语言并不要求对所使用的变量进行事先声明,也不需要指定变量类型,它会自动根据赋予变量的值或对变量进行的操作来确定变量的类型并为其分配内存空间.在赋值过程中,如果变量已存在,MATLAB将使用新值代替旧值,并以新的变量类型代替旧的变量类型.
MATLAB中变量的命名规则是: 1、变量名区分大小写;
2、变量名的长度不超过31位,第31个字符之后的字符将被忽略;
3、变量名必须以字母开头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号.
MATLAB中有一些预定义的变量,这些特殊的变量称为常量.
MATLAB语言中的常量
常量名 i, j pi eps NaN 常量值 虚数单位 圆周率 计算机的最小浮点数 Not-a-Number,非数,特指0/0 常量名 realmin realmax inf flops 常量值 最小可用正实数 最大可用正实数 正无穷大,如1/0 浮点运算数 在MATLAB语言中,定义变量时应避免与常量名相同,以免改变常量的值. 与其他程序设计语言相同,MATLAB语言中也存在变量作用域的问题.在未特殊说明的情况下,MATLAB语言将所识别的一切变量视为局部变量,即仅在其调用的函数内有效.若要定义全局变量,应对变量进行声明,即在该变量前加关键字global.
二、数学运算符号及标点符号
数学运算符号:+加法运算;-减法运算;*乘法运算;.*点乘运算;/右除运算;\\左除运算;./点右除运算;.\\点左除运算;^ 乘幂运算.
MATLAB中标点符号的含义是:
1、在命令窗口中输入一个MATLAB语句(语句的一般形式为:变量=表达式),如果
语句后为逗号或无标点符号,则在命令窗口中显示该语句的计算结果;如果语句后为分号,MATLAB只进行计算,不在命令窗口中显示计算结果.如果要查看计算结果,只需要在命令窗口中输入变量名按回车键或打开工作空间双击选中的变量即可.
2、在MATLAB的命令窗口中输入一个表达式或利用MATLAB进行编程时,如果表达式太长,可以用续行符号“…”将其延续到下一行.
3、编写MATLAB程序时,通常利用符号“%”对程序或其中的语句进行注释.
三、函数
MATLAB语言中最基本最重要的成分是函数.一个函数由函数名、输入变量和输出变量组成.同一个函数,不同数目的输入变量和不同数目的输出变量,均代表不同的含义.这不仅丰富了MATLAB的函数功能,而且大大减少了需要的磁盘空间,使得MATLAB编写的程序简单而且高效.
MATLAB的函数,按照用途,可以分为三类:标量函数、向量函数和矩阵函数. 1、标量函数:标量函数作用于标量,一般用于简单的数值计算.常用的标量函数有三角函数、指数对数函数、复数函数、截断函数和求余函数等.
三角函数:sin、cos、tan、cot、sec、csc、asin、acos、atan、acot、asec、acsc、sinh、cosh、tanh、asinh、acosh、atanh;
指数和对数函数:exp(以e为底的指数函数)、pow2(以2为底的指数函数)、sqrt(正的平方根函数)、realsqrt(正的平方根函数,若输入不是正数则报错)、nthroot(n次方根函数)、log(自然对数函数)、reallog(自然对数函数,若输入不是正数则报错)、log10(以10为底的对数函数)、log2(以2为底的对数函数);
复数函数:abs(绝对值或复数模)、angle(复数的相角或幅角)、conj(复数共轭)、real(复数实部)、imag(复数虚部)、complex(用实部和虚部构造复数)、isreal(判断是否为实数矩阵).例如:c=complex(a,b) 将根据的a、b构造复数c, 复数c的实部为a,复数c的虚部为b. >>a=[1 2;3 4];b=[5 6;7 8] >> c=complex(a,b)
截断和求余函数:mod(除法求余数,与除数同号)、rem(除法求余数,与被除数同号)、sign(符号函数)、fix(朝零方向取整函数)、floor(向负无穷方向取整函数)、ceil(向正无穷方向取整函数)、round(四舍五入函数)、rats(有理逼近函数).
当一个标量函数作用于向量或矩阵时,是这个标量函数作用于这个向量或矩阵的每一个元素.这个功能将大大方便我们处理成批的数据.
2、向量函数:MATLAB中有些函数只有当它们作用于行向量或列向量时才有意义,称为向量函数.常用的向量函数:max(最大值)、min(最小值)、sum(和)、length(长度)、mean(平均值)、median(中数)、prod(乘积)、sort(从小到大排列). 例如:
>>x=[0.6833,0.2126,0.8392,0.6288,0.1338,0.2071,0.6072,0.6299,0.3705,0.5751]; >>a=max(x), b=min(x),c=mean(x),d=median(x)
当一个向量函数作用于一个矩阵时会产生一个行向量,这个行向量的每个元素是向量函数作用于矩阵相应列向量的结果.
在MATLAB的统计工具箱中,我们还会学习到许多向量函数.
3、矩阵函数:MATLAB中有大量的矩阵函数,从其作用来看,可以分为构造矩阵的函数和进行矩阵计算的函数,详见下一节.
Prod函数:对于向量返回的是向量内所有元素的乘积;对于矩阵,每列返回一个乘积值。
§2.3 MATLAB的数值计算功能
强大的数值计算功能是MATLAB最具代表性的特点.也正是由于MATLAB具有强大的数值计算功能,MathWorks公司才有能力把MATLAB延伸到不同专业、不同行业和不同部门的各个领域,使其成为世界上最优秀的、应用最为广泛的、最受用户喜爱的数学软件.
一、数组及其运算
1、数组的建立 (1). 直接输入数组
建立数组最直接的方法是在命令窗口中直接输入数组.数组元素需要用方括号“[ ]”括起来,元素之间可以用空格、逗号或分号分隔.需要注意的是,用空格和逗号分隔建立行数组,元素之间全部用分号分隔建立列数组.
(2). 利用冒号表达式建立数组, 此时不用方括号“[ ]”.
冒号表达式建立等差数组,它的基本形式为x=x1:step:x2, 其中x1 、step、x2 分别为给定数值,x1表示数组的首元素数值,step 表示步长,即从第二个元素开始,后一个元素与前一个元素之间的差值,x2表示数组尾元素数值限.注意:x2并非尾元素数值,当x2-x1为step的整数倍时,x2才是尾元素数值.例如:>>a=1:2:12 和>>a=1:2:13
注:(a).如果step=1, 可以省略此项的输入,直接写成x=x1:x2.
(b).如果x1< x2,则需要step>0;如果x1> x2, 则需要step<0;如果x1= x2, 则建立的数
组只有一个元素. (3). 线性等分数组的建立
MATLAB提供了函数linspace用来建立线性等分数组,调用格式如下: y=linspace(x1,x2) 建立100维的等分数组,使得y(1)=x1,y(100)=x2; y=linspace(x1,x2,n) 建立n维的等分数组,使得y(1)=x1,y(n)=x2.例如:
>>y=linspace(1,100), y=linspace(1,100,6)
线性等分函数和冒号表达式都可以建立等分数组,前者是设定了数组的维数去建立等分数组,后者是通过设定步长建立维数随之确定的等分数组. (4). 对数等分数组的建立
MATLAB中提供了对数等分函数logspace生成等比数组,将此数组取以10为底的对数可生成等差数组.调用格式如下:
y=logspace(x1,x2) 生成50维对数等分数组,使得y(1)=10x1, y(50)=10x2;例如:>>y=logspace(5,8);
y=logspace(x1,x2,n) 生成n维对数等分行数组,使得y(1)=10x1, y(n)=10x2.
另外,数组还可以从矩阵中抽取,还可以把数组看成1*n阶或n*1阶的矩阵,以矩阵形式生成.由于在MATLAB中矩阵比数组重要的多,此类函数将在矩阵及其运算中详细介绍. 2、数组元素的调用
(1). 调用数组的一个元素:数组的元素可以通过下标调用,如x(i)表示数组x的第i个元素. (2). 调用数组的部分元素:x(a:b:c)表示调用数组x的从第a个元素开始,以步长为b到第c个元素,b可以为负数,b缺省时为1.
(3). 直接使用元素序号调用数组元素:x([a b c d])表示调用数组x的第a、b、c、d个元素构成一个新数组[x(a) x(b) x(c) x(d)]. 3、数组的运算
(1). 数组对标量的加、减、乘、除、乘方是数组的每个元素对该标量进行相应的加、减、乘、除、乘方运算.
设a=[a1 a2 … an], c=标量,则 a±c=[a1±c a2±c … an±c]; a*c=c*a=a.*c=[a1*c a2*c … an*c] a/c=a./c=[a1/c a2/c … an/c] a\\c=a.\\c=[a1\\c a2\\c … an\\c] a^c=a.^c=[a1^c a2^c … an^c] c^a=c.^a=[c^a1 c^a2 … c^an]
(2). 两个相同维数的数组进行加、减、乘、除、幂运算,可按元素对元素的方式进行,不同大小或维数的数组不能进行运算.
设a=[a1 a2 … an],b=[b1 b2 … bn],则 a±b=[a1±b1 a2±b2 … an±bn]; a.*b=[a1*b1 a2*b2 … an*bn] a./b=[a1/b1 a2/b2 … an/bn] a.\\b=[a1\\b1 a2\\b2 … an\\bn] a.^b=[a1^b1 a2^b2 … an^bn]
(3). 两个相同维数的数组的点积由dot函数实现,调用格式:dot(a,b).
(4). 两个三维数组之间的向量积由cross函数实现,调用格式:cross(a,b).其中a,b必须是三个元素的向量。
二、矩阵及其运算
由于MATLAB的数值计算功能都是以(复)矩阵为基本单元进行的,因此,MATLAB中矩阵的运算可谓最全面、最强大.本小节将对矩阵及其运算进行详细的阐述. 1、矩阵的建立
(1). 直接输入小矩阵
在键盘上直接输入矩阵是最方便、最常用和最好的建立数值矩阵的方法,尤其适合较小的简单矩阵.用此方法建立矩阵时,应当注意以下几点:
(a). 输入矩阵以“[ ]”为其标识,即矩阵的元素应在“[ ]”的内部,此时MATLAB才将其识别为矩阵,如:a= [ 1 2 3; 1 1 1; 4, 5, 6]
(b). 矩阵的同行元素之间可由空格或逗号分隔,行与行之间用分号或回车符分隔; (c). 矩阵大小可不预先定义;
(d). 若不想获得中间结果,在[ ]后可用分号结束; (e). 无任何元素的空矩阵也合法;
(f). 矩阵元素可以为运算表达式,如 b= [sin(pi/3), cos(pi/4); log(9), tanh(6)].
(2). 当矩阵很大,不适合在命令窗口直接输入时,可以使用MATLAB提供的矩阵编辑器来完成矩阵的输入和修改.在使用矩阵编辑器时,必须首先在命令窗口中预先定义一个变量,这个变量可以是数或简单的矩阵.例如在命令窗口中输入A=1,打开工作空间窗口,选中变量A双击,就可以打开矩阵A的编辑器,通过添加或修改原来的元素,从而建立起我们需要的矩阵.
(3)、通过M文件建立大矩阵
当矩阵的规模比较大,直接输入法就显得笨拙,出现差错也不易修改.为了解决此问题,可以通过M文件输入矩阵.M文件是一种可以在MATLAB环境中运行的文本文件,分为命令文件和函数文件两种.这里是用命令M文件来建立大型矩阵.从菜单栏的File中选择New,再选择M-file命令,打开MATLAB Editor窗口,按格式把所要输入的矩阵写入一文本文件中,并将此文件以m为扩展名,即为M文件.在MATLAB命令窗口中输入此M文件名,运行后则把M文件中的大型矩阵输入到MATLAB的内存中. 例如:编制一名为example.m的M文件,内容如下:
A=[456 468 873 2 579 55; 21, 687,54 488 8 13; 65 4656 88 98 21 5] 在MATLAB 命令窗口输入:
>>example % 将矩阵A调入到MATLAB的内存中
说明:M文件要保存在MATLAB的搜索路径上,才能在MATLAB的命令窗口中调用. (4). 利用矩阵函数建立矩阵
可以用MATLAB的函数来建立全零矩阵、全1矩阵、单位矩阵、均匀分布(标准正态分布)随机矩阵、对角矩阵和上、下三角矩阵等特殊矩阵.矩阵元素全是0或1的矩阵由zeros或ones来建立,单位矩阵由eye建立,均匀分布随机矩阵和标准正态分布随机矩阵分别由rand和randn来建立.
下面的函数fun表示zeros, ones, eye, rand, randn中的任意一个. fun(N) 建立相应的N*N阶矩阵; fun(M,N) 建立相应的M*N阶矩阵; fun(size(A)) 建立与A同阶的相应矩阵.
MATLAB中的单位矩阵和数学中的单位矩阵的含义稍有不同,MATLAB中的单位矩阵可以为长方阵,在行标和列标相等的地方元素为1,其他元素为0.
利用函数diag建立对角矩阵:diag(v,k) 当v是一个包含n个元素的向量时,返回一个阶数为n+abs(k)的方阵,其第k阶对角线上为向量v中的元素,k=0表示主对角线,k>0表示在主对角线之上,k<0表示在主对角线之下,diag(v)=diag(v,0).例如: >>v=[1 2 3];A=diag(v,2),B=diag(v,-2),C= diag(v)
在diag函数中,当v为矩阵时,返回一个列向量,该向量由矩阵的第k条对角线的元素构成.如:
>>A=magic(4);diag(A,1)
tril(A,k)抽取矩阵A的第k条对角线下面的部分(包第k条对角线);tril(A)抽取矩阵A的主下三角部分; triu(A,k)抽取矩阵A的第k条对角线上面的部分(包第k条对角线);triu(A)抽取矩阵A的主上三角部分;例如:
>>A=magic(5), B=tril(A,-1),C=triu(A),D=triu(A,1)
MATLAB提供了许多建立其它特殊矩阵的函数,如 compan、hadamard、hilb、 invhilb、 magic、pascal等等,感兴趣的读者可以参考有关MATLAB的书籍. (5). 通过矩阵的扩展建立新矩阵
(i).通过对分块矩阵进行赋值建立新的矩阵,A(m1:m2, n1:n2)=a,其中m2-m1+1必须等于a的行维数, n2-n1+1必须等于a的列维数.生成的m2*n2维的矩阵A,除赋值子阵和已存在的元素外,其余元素都默认为0.例如 >>a=hilb(3), n阶希尔伯特矩阵A(2:4, 5:7)=a (ii).通过小矩阵的组合建立大矩阵.例如: >>v= [1 2 6 20]; a2=[-v(2:4); eye(2),zeros(2,1)]; (6). 通过矩阵的合并建立新矩阵
(i).C=[A B] 在水平方向合并矩阵,A,B必须具有相同的行数.C=[A;B]在竖直方向合并矩阵,A,B必须具有相同的列数.
(ii).分块对角矩阵的建立
out=blkdiag(a,b,c,d,…) 根据输入的‘a?, ?b?, ?c?, ?d?等参数来构造一个分块对角矩阵.作为输入参数的矩阵不必是方阵,也不必具有相等的大小,例如:
>>a=1; b=[2,2;3,3]; c=[4 4;5 5;6 6];d=8; >>out=blkdiag(a,b,c,d)
(iii).通过复制矩阵来建立新的矩阵.
B=repmat(A,m,n) 或 B=repmat(A,[m,n]) 返回一个以矩阵A为元素的m*n矩阵B.例如:>>A=[1 2;3 4]; B=repmat(A,2,1),C=repmat(A,2,2) 2、矩阵元素的调用
矩阵元素的调用包括利用矩阵的双索引调用矩阵的元素和利用矩阵的单索引调用矩阵的元素两种方式.
(1).利用矩阵的双索引来调用矩阵的元素
若A是一个2维矩阵,可以用A(i,j)来调用矩阵A的第i行第j列的元素,A(i,:)是调用矩阵A的第i行,A(:,j)是调用矩阵A的第j列,A([1,3],[2,4])得到由矩阵A的第1、3行和第2、4列交叉处元素所构成的矩阵.例如:
>>A=magic(3), a=A(3,2), b=A(2,:),c=A(:,3),d=A([1 3],[2 3])
>>L=A(2,:)<5 %返回由0-1组成的向量,矩阵A的第2行元素小于5的位置返回1,不小于5的位置返回0.
(2).利用矩阵的单索引来调用矩阵的元素
通过单索引来调用矩阵的元素的格式为A(k).在MATLAB中,矩阵是按列优先排列的一个长列向量格式来存储的,例如A=[2 6 9;4 2 8;3 0 1].在MATLAB中是被存储成以2、4、3、6、2、0、9、8、1排列的一个列向量.矩阵A的第3行第2列,也就是值为0的元素在存储空间上是第6个元素.可以用A(6)调用这个元素,这就是单索引调用矩阵元素的方法.命令B=A(:)得到B=[2;4;3;6;2;0;9;8;1].
(3).调用矩阵元素方式的转换
如果已经有矩阵元素的双索引,可以用sub2ind函数来得到该元素的单索引.例如: >>A=[2 6 9;4 2 8; 3 0 1]; linearindex=sub2ind(size(A),3,2)
反之,可以利用函数ind2sub从矩阵元素的单索引得到矩阵元素的双索引,例如: >>[row col]=ind2sub(size(A),6) 3、矩阵元素的修改
前面我们提到可以用矩阵编辑器来改变矩阵中的元素,下面介绍在工作空间中直接修改矩阵的元素.如在命令窗口中输入A=rand(3,4) 生成一个3*4的随机矩阵.在命令窗口中再输入A(3,2)=10 回车后,就将矩阵A的第3行第2列的元素修改为10.在命令窗口中输入A(4,5)=10,则原来3*4的矩阵就扩充为4*5的矩阵,其中扩充后的矩阵在(4,5)处的元素为10,其它扩充后新增加的元素系统都设为0.
我们可以利用空矩阵来删除矩阵的某些行或列.在MATLAB中定义[ ]为空阵,MATLAB工作内存中确实存在被赋予空阵的变量;空阵中不包括任何元素,它的阶数是0*0;空阵可以在MATLAB的运算中传递;可以用clear命令从内存中清除空阵变量.
要删除矩阵的某一行或某一列,只要把该行或该列赋予一个空矩阵即可.例如: >>a=[1 2 3; 4 5 6; 7 8 9],a(:, 2)=[ ] %使矩阵a的第2列为空阵. 4、矩阵的运算
(1). 矩阵与标量的运算:与数组与标量的运算类似.
(2). 两个矩阵元素之间的运算:与两个数组元素之间的运算类似. (3). 矩阵的加、减法 A±B (4). 矩阵的乘法 A*B
(5). 矩阵的除法 矩阵除法有左除“\\”和右除“/”两种.方程AX=B的解用X=A\\B表示,方程 XA=B的解用 X=B/A表示.
(6). 方阵的逆运算 inv(A). (7). 方阵的行列式 det(A).
(8). 方阵的乘方运算 A^p.当p为正整数时,A^p表示矩阵A自乘p次;当p为负整数时,A^p表示矩阵A自乘|p|次,此时要求A可逆;当p为0时,A^0等于与A同维的单
-1-1
位阵;当p为分数时,若A可以分解为A=WDW,D为对角阵,则A^p=WDpW.
-1
(9). 矩阵的迹运算 trace(A) %矩阵A的主对角元素之和. (10). 矩阵的秩运算 rank(A).
(11). 矩阵的特征值和特征向量:eig(A), 不同的输出产生不同的结果. >>d=eig(A); % 计算矩阵A的特征值
>>[V,D]=eig(A); % V为特征向量矩阵,D为特征值矩阵,V的第i列是相应于矩阵D中(i,i) 处特征值的特征向量.
(12). 矩阵和向量的范数运算 矩阵(向量)的1范数、2范数、无穷范数和F范数的运算可由函数norm实现,其中norm的调用格式为norm(X,P), P的取值分别是1,2,inf,fro.
(13). 矩阵的条件数函数
矩阵的条件数是判断矩阵“病态”程度的量度,在理论分析中有着重要的应用.cond(A)得到矩阵A的2-范数意义下的条件数;condest(A)得到矩阵A的1-范数意义下的条件数;rcond(A)得到矩阵A的2-范数意义下的条件数的倒数.
(14). 矩阵的LU分解(Gauss消去法)
对于方阵A,LU分解为:A=LU,其中L为下三角矩阵的基本变换形式(一个下三角矩阵和置换矩阵的乘积),U为上三角矩阵.在MATLAB中,利用矩阵的LU分解求解方程A*x=b得到x=U\\(L\\b),这大大提高了计算速度.另外,矩阵的求行列式和求逆也是通过矩阵的LU分解来实现的:det(A)=det(L)*det(U), inv(A)=inv(U)*inv(L). >>[l,u]=lu(A)
>>[L,U,P]=lu(A) %返回一个上三角矩阵U、一个下三角矩阵L和置换矩阵P,并满足L*U=P*A.
(15). 矩阵的Cholesky分解
如果A为n阶对称正定矩阵,则存在一个非奇异的上三角实矩阵R,使得A=RR.当限定R的对角元素为正数时,这种分解是唯一的,称为Cholesky分解.
R=chol(A) %如果A不是对称正定矩阵,则给出错误信息. (16). 矩阵的QR分解
A=QR, 其中Q为正交矩阵,R为上三角矩阵,若限定R的对角元为正数,则分解是唯一的. >>[Q,R]=qr(A) 返回正交矩阵Q和上三角矩阵R,它们满足A=Q*R. >>[Q,R,P]=qr(A) %AP=QR, P为交换矩阵.
三、多项式运算
1、多项式的建立
在MATLAB中多项式P(x)=a0xn+a1xn-1+…+an-1x+an由行向量P=[a0,a1,…,an-1,an]表示,这样就把多项式的问题转化为向量的问题.
(1). 由系数向量建立多项式:在MATLAB中,由于多项式是以向量形式储存的,因此,建立多项式的最简单的方法是直接输入向量,MATLAB自动将向量元素按降幂顺序分配给多项式的各系数值,向量可以为行向量,也可以是列向量.
例: 输入多项式x3-5x2+6x-33. >>p=[1 -5 6 -33 ];
(2). 特征多项式的建立:矩阵的特征多项式由函数poly实现. >>A=[1 2 3; 2 3 4; 3 4 5]; p=poly(A)
(3). 由多项式的根建立多项式:由给定的根建立相应的多项式也由函数poly实现. >>root=[ -5 -3+4i -3-4i]; p=poly(root) 2、多项式的运算
(1). 求多项式的值.求多项式的值有两种形式,对应着两种算法:一种是以数组为计算单元,此时的计算函数是polyval, 调用格式为y=polyval(p,x),其中p为行向量形式的多项式,x为代入多项式的值,它可以是标量、向量、矩阵.如果x是向量或者矩阵,该函数将对向量或者矩阵的每一个元素计算多项式的值. 另一种是以方阵为计算单元,进行矩阵运算,求得矩阵多项式的值,此时的计算函数为polyvalm. 这两种计算的差别是源于数组运算和矩阵运算的差别.
>>p=[1 11 55 125];x=[1 1;2 2]; >>a=polyval(p,x) >>b=polyvalm(p,x)
T
(2). 求多项式的根.求多项式的根有两种方法,一种是直接调用MATLAB的函数roots求多项式的所有根;另一种是通过先建立多项式的伴随矩阵再求其特征值的方法得到多项式的所有根.
例:用两种方法求解方程2x4-5x3+6x2-x+9=0的所有根. >>p=[2 -5 6 -1 9]; roots(p) >>a=compan(p), eig(a)
(3). 多项式的乘除法运算.多项式的乘法由函数conv实现,多项式的除法由函数deconv来实现.
>>p1=[2 -5 6 -1 9]; p2=[3 -90 -18 ]; >>p=conv(p1,p2) %多项式乘法 >>[q,r]=deconv(p,p2) %多项式除法
(4). 多项式的微分.函数polyder可以实现多项式的微分计算. >>c=[4 13 28 27 18]; >>q=polyder(c)
>>q=polyder(a,b) %求a*b的导数 >>[q,d]=polyder(a,b) %求a/b的导数
(5). 多项式的拟合.多项式拟合是多项式运算的一个重要组成部分,在工程及科研工作中都得到了广泛的应用.MATLAB提供了专用的拟合函数polyfit. 其调用格式如下:
polyfit(X,Y,n) 其中X,Y为拟合数据, n为拟合多项式的阶数. [p,s]= polyfit(X,Y,n) 其中p为拟合多项式系数向量,s为误差估计数组. 例:用4次多项式对[0,pi/2]上的正弦函数进行最小二乘拟合. >>x=0:pi/20:pi/2; y=sin(x); % 获得[0,pi/2] 上的数据点 >>a=polyfit(x,y,4) % 进行多项式拟合.
§2.4 MATLAB的图形功能
在进行数值计算的过程中,为了从直观上认识计算结果,可以通过MATLAB的图形功能将计算结果图形化.MATLAB是通过描点、连线来作图的,因此,在作二维图形和三维图形之前,必须先取得该图形上一系列点的坐标,然后利用MATLAB函数作图.下面着重介绍二维图形的画法,对三维图形只作简单叙述.
一、二维图形
二维图形的绘制是MATLAB图形功能的基础,也是在绝大多数数值计算中广泛应用的图形方式之一.
1、基本绘图命令
(1). plot命令 绘制二维图形最常用的命令是plot.对于不同形式的输入,该函数可以实现不同的功能.
(i). 当plot函数仅有一个输入变量时:plot(X)
如果X为实向量,则以X的索引坐标作为横坐标,以X的各元素作为纵坐标绘制图形.如果X为复向量,则以X的实部作为横坐标,虚部作为纵坐标绘制图形.如果X为实数矩阵,则绘制X的列向量对其坐标索引的图形.如
>>X=[0 0.5 0.75 0.95 0.8 0.35]; plot(X) %图4.1 >>X=[1+2i,2+4i,3+2i,5+i,6+4i];plot(x) %图4.2
图4.1 图4.2
(ii). 当plot函数有两个输入变量时:plot(X,Y)
当X和Y为向量时,X和Y的维数必须相同,而且同时为行向量或同时为列向量.此时以第一个向量的分量为横坐标,第二个向量的分量为纵坐标绘制图形,这是实际应用过程中最为常用的.例如:
>>x=0:0.01*pi:pi; y=sin(x).*cos(x); %注意:此处的.*表示两个向量对应元素的乘积. >>plot(x,y) %图4.3
图4.3 图4.4
当X,Y为m*n矩阵时,将在同一幅图中绘出n条不同颜色的连线.绘制规则为: 以X矩阵的第j列分量作为横坐标,矩阵Y的第j列分量作为纵坐标,绘得第j条连线.若在同
一幅图中出现多条曲线,MATLAB会自动地把不同曲线绘制成不同的颜色,以进行简单的区别.如:
>>x=0:0.01*pi:pi; y=[sin(x'),cos(x')]; >>plot([x',x'],y)
(iii). 当plot函数有三个输入变量时:plot(X,Y, 'Linespec')
想绘制不同的线型、颜色、标识等的图形时,可以调用此形式,第3个输入变量为图形显示属性的设置选项:线型、颜色、标识.
线型:-实线; : 点线;-. 虚点线;--虚线;
颜色:y 黄;m紫;c青;r 红;g 绿;b 蓝;w 白;k 黑;
标识:. 点;o圆点;x 叉号;+ 加号;* 星号;s方形;d菱形;v下三角;^ 上三角;
< 左三角;> 右三角;p 五角星;h 六角星.
应用上述符号的不同组合可以为图形设置不同的线型、颜色、标识.在调用时,选项应置于单引号内,当多于一个选项时,各选项直接相连,中间不需要任何的分隔符.如:
>>x=1:0.1*pi:2*pi; y=sin(x); z=cos(x); plot(x,y,'--k',x,z,'-.kd') %图4.4 (2). fplot命令
前面介绍的plot命令是根据外部输入数据或通过函数数值计算得到的数据进行作图.而在实际应用中,我们可能并不知道某一函数随自变量变化的趋势,此时若采用plot命令来绘图,则有可能会因为自变量的取值间隔不合理而使曲线图形不能反映出自变量在某些区域内函数值的变化情况.当然我们可以将自变量间隔取得足够小以体现函数值随自变量变化的曲线,但这样会使数据量变大.
fplot命令可以很好地解决这个问题.该命令通过内部的自适应算法来动态决定自变量的取值间隔,当函数值变化缓慢时,间隔取大一点;变化剧烈时,间隔取小一点.fplot命令的调用方式:
fplot(@fun, [xmin xmax ymin ymax]) 在[xmin xmax]内画出字符串fun表示的函数的图形,[ymin ymax]给出了y的限制.例如:
>>fplot('sin(x)./x',[-20 20 -0.3 1.3]) %图4.5
图4.5 图4.6
2、图形处理的基本技术
除了提供强大的绘图功能外,MATLAB语言还有极为强大的图形处理能力.下面介绍一些图形处理技术,包括图形控制、图形标注、图形保持以及子图的绘制等.
(1). 图形控制
MATLAB语言中较常用的图形控制函数有坐标轴控制函数axis、坐标轴缩放函数zoom和坐标网格函数grid等.
(i). axis函数控制坐标轴的特征
在缺省情况下MATLAB自动选择图形的横、纵坐标的比例,如果你对这个比例不满意,可以用axis命令控制,常用的有:
axis([xmin xmax ymin ymax]) [ ]中分别给出了x轴和y轴的最小、最大值; axis equal 或 axis('equal') x轴和y轴单位长度相同; axis square 或 axis('square') 图框呈方形; axis off 或 axis('off') 清除坐标刻度.例如:
>>x=0:0.025:pi/2; plot(x,tan(x),'-ko') %使用axis命令设定坐标轴之前的图形 图4.6 >>axis([0 pi/2 0 5]) %使用axis命令设定坐标轴之后的图形 图4.7
图4.7 图4.8
(ii). zoom函数控制坐标轴的缩放:zoom函数可以实现对二维图形的缩放,该函数在处理局部较为密集的图形中有很大作用.常用的调用格式有:
zoom 在zoom on 和zoom off之间切换; zoom on 允许对图形进行缩放; zoom off 禁止对图形进行缩放; zoom xon 允许x 轴缩放; zoom yon 允许y轴缩放; zoom out 恢复进行的一切缩放.
当zoom处于on 状态时,可以通过鼠标进行图形缩放,单击鼠标左键将光标处的图形放大一倍;而单击鼠标右键将光标处的图形缩小一倍;双击鼠标左键则将会恢复缩放前的状
态,即取消一切缩放操作.
应当注意,对图形的缩放不会影响图形的原始尺寸,也不会影响图形的横纵坐标的比例,即不会改变图形的基本结构.
(iii). grid函数控制平面图形的坐标网格:MATLAB提供了平面网图函数grid用于绘制坐标网格,提高图形显示效果.grid函数的调用格式如下:
grid on 在图形中绘制坐标网格; grid off 取消坐标网格.
单独的函数grid将实现grid on 与grid off两种状态之间的转换. >>x=0:0.1*pi:2*pi; y=sin(x); >>plot(x,y) >>grid on %图4.8 (2). 图形的标注
MATLAB语言还提供了丰富的图形标注函数供用户自由地标注所绘制的图形. (i).坐标轴标注和图形标题
xlabel ylabel 为x, y坐标轴添加标注 title 为图形添加标题
xlabel('标注内容','属性1', '属性值1', '属性2', '属性值2',…) %属性包括标注文本的属 性,包括字体大小、字体名等.
三个函数的调用结果的区别仅在于标注所处的位置不同,title 给出的标注将置于图的 顶部,而xlabel 和ylabel则分置于相应的坐标轴的边上.例如:
>>x=1:0.1*pi:2*pi; y=sin(x); >>plot(x,y)
>>xlabel('x(0-2\\pi)', 'fontweight', 'bold');
>>title('y=sin(x)','fontsize', 12, 'fontweight', 'bold') 不加单引号 %图4.9
图4.9 图4.10
在标注过程中经常会遇到特殊符号的输入问题,为了解决这个问题,MATLAB语言提供了相应的字符转换,如:\\alpha→α;\\beta→β;\\gamma→γ;\\delta→δ;\\epsilon→ε;\\zeta
→δ;\\pi→π;\\omega→ω;\\Omega→Ω等等.
用户也可以对文本标注进行显示控制,如:\\bf 黑体,\\it 斜体,\\rm 标准形式,例如: >>x=-10:0.1:10; y=exp(-x.^2/2); >>plot(x,y, '-')
>>title('\\bf y=e^{-x^{2}/2}') %图4.10 (ii). 文本标注
MATLAB对图形进行文本注释所提供的函数为text和gtext.
text函数的调用格式:text(x,y, '标注文本及控制字符串') 其中(x,y)给定标注文本在图中添加的位置,例如:
>>x=1:0.1*pi:2*pi; y=sin(x); >>plot(x,y)
>>text(3*pi/4,sin(3*pi/4), '\\leftarrow sin(3\\pi/4)=0.707')
>>text(5*pi/4,sin(5*pi/4),['sin(5\\pi/4)=',num2str(sin(5*pi/4)),'\\rightarrow'],'HorizontalAlignment', 'right', 'Fontsize', 12) %图4.11
%属性HorizontalAlignment用来控制文本标注输入起点是在标注本身的左侧还是右侧.
图4.11 图4.12
交互式文本输入函数gtext. 使用该函数,用户可以通过使用鼠标来选择文本输入的点, 单击后,系统将把指定的文本输入到所选的位置上.
>>x=1:0.1*pi:2*pi; y=sin(x); >>plot(x,y)
>>gtext('y=sin(x)', 'Fontsize', 12)
执行该函数时,将鼠标放在图形上会出现“+”字型交叉线供用户添加标注的点,选择添加标注的位置后,单击鼠标左键即可在该位置上添加标注.
(iii). 图例标注
在对数值计算结果进行绘图时,经常会出现在同一张图形中绘制多条曲线的情况,这时可以使用legend命令为曲线添加图例以便于区别它们.legend 函数能够为图形中的所有曲线进行自动标注,以其输入变量作为标注文本,具体调用格式如下:
legend('标注1', '标注2',…) 标注1,标注2等分别对应绘图过程中按绘制先后顺序所 生成的曲线.
>>x=0:0.1*pi:2*pi; y=sin(x); z=cos(x); >> plot(x,y,'k-o',x,z,'k--h')
>>legend('sin(x)', 'cos(x)') %图4.12
可以用鼠标拖动图例框改变其在图中的位置.也可以在legend函数调用时进行简单的定位设置:legend('标注1', '标注2',…, '定位代号') MATLAB 给出了6个定位代号,具体说明如下:
0: 自动定位,使得图标与图形重复最少;1: 置于图形的右上角(默认值);2: 置于图形的左上角;3: 置于图形的左下角;4: 置于图形的右下角;-1: 置于图形的右外侧.
关于标注位置,没有必要记住,可以通过在线帮助获得.help legend 图例标注后,也可以用鼠标来调整图例标注的位置. (3). 图形保持与子图
(i).图形保持
在绘图过程中,经常会遇到在已存在的一张图中添加新的曲线,这就要求保持已存在的图形,MATLAB语言中实现该功能的函数是hold.
hold on 启动图形保持功能,此后绘制的图形将添加到当前的图形窗口中,并自动调整坐标轴的范围;
hold off 关闭图形保持功能,新绘制图形将覆盖原图形. hold 在hold on 和 hold off之间切换.如: >>x=0:0.1*pi:2*pi; y=sin(x); z=cos(x); >>plot(x,y,'k-*') >>hold on >>plot(x,z, 'k-o') >>plot(x,y+z,'k-h')
>>legend('sin(x)', 'cos(x)', 'sin(x)+cos(x)', 0) >>hold off %图4.13
图13
(ii).子图
在绘图过程中,经常需要将几个图形在同一图形窗口中表示出来,但又不在同一个坐标系中绘制,此时要用到函数subplot.调用格式如下:
subplot(m,n,p) 将一个图形窗口分割成m*n个小窗口,可以通过参数p分别对若干子 绘图区域进行操作,子绘图区域的编号为按行从左至右编号.如果p是一个向量,则创建一坐标轴,包含所有罗列在p中的小窗口.
例如:在四个子图中绘制不同的三角函数图. >>x=0:0.1*pi:2*pi;
>>subplot(2,2,1) %第1个绘图子域 >>plot(x,sin(x), '-*'); axis([0 2*pi -1 1]); title('sin(x)') >>subplot(2,2,2) %第2个绘图子域 >>plot(x,cos(x), '-o'); axis([0 2*pi -1 1]); title('cos(x)') >>subplot(2,2,3) %第3个绘图子域
>>plot(x,2*sin(x).*cos(x), '-x'); axis([0 2*pi -1 1]); title('2sin(x)cos(x)') >>subplot(2,2,4) %第4个绘图子域
>>plot(x,sin(x)./cos(x), '-h'); axis([0 2*pi -1 1]); title('sin(x)/cos(x)') %图4.14
尽量避免使用循环:循环运算经常被认为是MATLAB编程的瓶颈问题,是MATLAB语言中的最大弱点,在程序设计时,应当尽可能避免循环运算.由于矩阵是MATLAB语言的核心,所以,在MATLAB编程过程中应当强调对矩阵本身整体的运算,避免对矩阵元素的操作.应当注意的是,绝大多数的循环运算是可以转化为向量运算的.
在必须使用多重循环的情况下,如果两个循环执行的次数不同,则建议在循环的外环执行循环次数少的,内环执行循环次数多的.这样也可以显著提高速度.
2、数据的预定义
虽然在MATLAB语言中没有规定变量使用时必须预先定义,但是对于未定义的变量,如果操作中出现越界赋值时,系统将不得不对变量进行扩充,这样的操作大大降低了程序运行的效率,所以,对于可能出现变量维数不断扩大的问题,应当预先估计变量可能出现的最大维数,进行预定义.建议在定义大矩阵时,首先用MATLAB的函数,如zeros或ones对之先进行定维,然后再进行赋值处理,这样会显著减少所需的时间的.
3、优先考虑MATLAB的函数
矩阵运算应该尽量采用MATLAB的函数,因为内在函数是由更底层的编程语言C构造的,其执行速度快于使用循环的矩阵运算.
习题
1.用plot和fplot绘制函数y=cos(tan(πx))图形.
2.在同一坐标系下绘制t2,-t2,t2sint在[0,2π]内的曲线图. 3.绘制r=θ和r=cos3θ的图形.
4.分别用for和while循环语句编程计算20!.
5.设函数f(x,y)=x2+sin(x+y)+5y,编写程序计算f(1,1)和f(3,1).
百度搜索“70edu”或“70教育网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,70教育网,提供经典综合文库matlab基础内容掌握在线全文阅读。
相关推荐: