1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第二章 矩阵和数组,第二章 矩阵和数组,2.1,概述,2.2,创建向量,2.3,创建矩阵,2.4,索引,2.5,基本运算,2.6,稀疏矩阵,2.7,多维数组,2.1,概 述,1,变量和常量,变量和常量是编程语言中数据类型的表现手段和形式,从,M,语言的角度,,掌握变量和常量的概念,也是掌握,M,语言编程的基础。,所谓变量,,就是指在程序运行过程中需要改变数值的量,每一个变量都有一个名字,变量将在内存中占据一定的空间,以便在程序运行的过程中保存其数值。,1,变量和常量,M,语言和,C,语言类似,对变量的命名
2、有相应的要求:变量必须以字母开头,后面可以是字母、数字或者下划线的组合,,最多,63,个字符。在,MATLAB,中,变量名区分字母的大小写。,尽管在编写程序的时候可以使用任意数量的字符表示变量名,但是,MATLAB,仅仅识别前面的,N,个字符,在不同的操作系统下可以识别的字符个数不尽相同。,所谓常量就是在程序运行的过程中不需要改变数值的量,例如,在求圆周周长或者圆的面积的时候,需要一个常量,,,它的值近似是,3.1415927,,常量也具有相应的名字,其定义方法和变量一样。,M,语言中的常量不像,C,语言中的常量,一般地在,M,语言中并不存在常量的定义,任何常量和变量都可以修改其数值,只不过在
3、MATLAB,中提供了一些常用的常数作为常量。,2,数组,一般的,数组是有序数据的集合,在大多数编程语言中,数组的每一个元素都属于同一种数据类型,它们使用同一个数组名称和不同的下标来惟一确定数组中的元素。其中下标是指数组元素在数组中的序号。,对,MATLAB,而言,大多数数据类型的数组,每一个元素都是同一个数据类型的元素,而对特殊的,元胞数组,则不然。,和一般的编程语言类似,,M,语言的数组也有一维、二维和多维数组的区别。在,MATLAB,中,一般不存在数组的数组,,除非在,M,语言中使用,Java,数据对象。,3,向量,从编程语言的角度上看,向量是一维数组,从数学的角度上看,向量就是,1N
4、或者,N1,的矩阵,即,MATLAB,的基本运算单位就是矩阵和向量,而,M,语言本身就是以向量化运算为基础的编程语言。,都是一维数组,在数学上分别被称为列向量和行向量。,4,矩阵,在,MATLAB,中,矩阵的概念就是线性代数中定义的矩阵。矩阵是用一对圆括号或者方括号括起来,符合一定规则的数学对象。如:,就是一个三行三列的方阵。,随着线性代数理论的发展,矩阵和向量的运算在工程领域内越来越普遍,因此对矩阵运算的实现成为诸多计算机软件工程师必须解决的问题。,对编程语言,矩阵就是二维的数组,而由于一般的编程语言仅能处理单个元素的运算,对矩阵或者向量的处理很难按照线性代数的运算法则,将其作为一个整体来
5、处理,从而降低了程序的执行效率和开发周期。近年来,诞生了很多专门用于处理矩阵运算的软件包和算法包,其中,MATLAB,软件就是从,EISPACK,和,LINPAC,两个线性代数软件包的基础上发展起来的。,2.2,创 建 向 量,从编程语言的角度看,向量就是一维数组。在,MATLAB,中创建向量可以使用不同的方法,最直接也最简单的方法就是,逐个输入向量的元素,,如例,2-1,。,例,2-1,用逐个输入元素的方法创建向量。,x=1 3 pi 3+5i,x=1.0000 3.0000 3.1416 3.0000+5.0000i,whos,Name Size Bytes Class,x 1x4 64
6、double array(complex),Grand total is 4 elements using 64 bytes,例子,2-2,利用冒号运算符创建向量。,在命令行窗口中键入:,x=1:10,x=1 2 3 4 5 6 7 8 9 10,whos,Name Size Bytes Class,x 1x10 80 double array,Grand total is 10 elements using 80 bytes,例,2-2,中使用冒号运算符创建了具有,10,个元素的向量。,用冒号运算符创建向量,的基本语法如下:,X=J:INC:K,其中*,J,为向量的第一个元素,而,K,为向量
7、的最后一个元素,,INC,为向量元素递增的步长;,*,J,、,INC,和,K,之间必须用“:”间隔;,*若在表达式中忽略,INC(,如例,2-2),,则默认步长为,1,;,*,INC,可以为正数也可以为负数,若,INC,为正数,则必须,JK,,,否则创建的为空向量。,例,2-3,使用冒号运算符创建向量。,在命令行窗口中键入:,x=1:0.01:1.1,x=,Columns 1 through 6,(栏目,1-6,),1.0000 1.0100 1.0200 1.0300 1.0400 1.0500,Columns 7 through 11,1.0600 1.0700 1.0800 1.0900
8、 1.1000,创建向量的第三种方法是,使用函数,linspace,和,logspace,。,linspace,是用来创建线性间隔向量的函数,函数,linspace,的基本语法为,x=linspace(x1,x2,n),其中*,x1,为向量的第一个元素,,x2,为向量的最后一个元素,,n,为向量具有的元素个数,函数将根据,n,的数值平均计算元素之间的间隔;,*若在表达式中忽略参数,n,,,则系统默认地将向量设置为,100,个元素。,例,2-4,使用,linspace,函数创建向量,x=linspace(1,2,5),x=1.0000 1.2500 1.5000 1.7500 2.0000,本例
9、中使用,linspace,函数创建了一个具有五个元素的向量,而元素之间彼此的间隔为,(2-1)/(5-1)=0.25,。,另外一个函数,logspace,被用来创建对数空间的向量,该函数的基本语法为,x=logspace(x1,x2,n),其中:,*该函数创建的向量第一个元素值为,x1,,,而最后一个元素的数值为,x2,,,n,为向量的元素个数,元素彼此之间的间隔按照对数空间的间隔设置;,*若在表达式中忽略参数,n,,,则参数默认地将向量设置为,50,个元素。,例,2-5,使用,logspace,函数创建向量。,在,MATLAB,的命令行窗口中键入下面的指令:,x=logspace(1,3,3
10、),x=,10 100 1000,上面创建的向量都是行向量,也就是说,创建的都是一行,n,列的二维数组,如果需要创建列向量,即,n,行一列的二维数组,则需要使用分号作为元素与元素之间的间隔或者直接使用转置运算符“,”,,参见例,2-6,。,例,2-6,创建列向量,%,直接输入元素的方法创建列向量,A=1;2;3;4;5;6,A=,1,2,3,4,5,6,%,使用转置的方法创建列向量,B=(1:6),B=1,2,3,4,5,6,whos,Name Size Bytes Class,A 6x1 48 double array,B 6x1 48 double array,Grand total is
11、 12 elements using 96 bytes,2.3,创 建 矩 阵,2.3.1,直接输入法,例,2-7,用直接输入矩阵元素的方法创建矩阵。键入指令:,A=1 2 3;4 5 6;7 8 9,A=1 2 3,4 5 6,7 8 9,whos,Name Size Bytes Class,A 3x3 72 double array,Grand total is 9 elements using 72 bytes,上例中创建了一个,33,的矩阵,在创建矩阵的时需要注意:,*整个矩阵的元素必须在“,”,中键入;,*矩阵的元素行与行之间需要使用分号“;”间隔,也可以在需要分行的地方用回车键间隔
12、矩阵的元素之间可以使用逗号“,”或者空格间隔。创建上面的矩阵时还可以用命令,B=1:3;4:6;7:9,B=1 2 3,4 5 6,7 8 9,2.3.2,数组编辑器,上述例子中使用,whos,指令来察看当前,MATLAB,会话保存在工作空间内存中的各种变量,此外,还可以使用,工作空间浏览器察看工作空间中包含的各种变量,,图,2-1,所示为执行了例,2-7,之后的工作空间浏览器。,在工作空间浏览器中可以察看当前工作空间中保存的各种数据的信息,利用工作空间浏览器,在相应的变量上单击鼠标右键,通过弹出的快捷菜单,(,如图,2-2,所示,),可以对矩阵或者向量进行编辑,也可以删除、重命名工作空
13、间的变量,还能够完成数据可视化的,工作。,图,2-1 MATLAB,的工作空间浏览器,图,2-2,工作空间浏览器的快捷菜单,clear,命令用于删除,MATLAB,工作空间中的变量。,who,和,whos,这两个命令用于显示在,MATLAB,工作空间中已经驻留的变量名清单。,who,命令只显示出驻留变量的名称,,whos,在给出变量名的同时,还给出它们的大小、所占字节数及数据类型等信息。,对矩阵或者向量元素的编辑可以通过数组编辑器完成,,调用数组编辑器,有以下几种不同的方法:,第一种,首先选择工作空间浏览器中的变量,然后单击工作空间浏览器工具栏中的按钮 ,这时系统将运行数组编辑器,同时在编辑器
14、中加载变量。在用鼠标选择工作空间中的变量时,可以按住,Ctrl,键或者,Shift,键选择多个变量,同样也可以使用快捷键,Ctrl+A,选择工作空间中的所有变量。,第二种方法是在工作空间浏览器中直接双击变量,也可以运行数组编辑器,同时在编辑器中加载变量。,第三种方法就是通过工作空间浏览器中的快捷菜单命令,Open,来完成同样的工作。,第四种方法是直接在,MATLAB,命令行窗口中键入如下指令:,openvar,A,也可以在数组编辑器中打开变量,A,。,打开矩阵,A,的数组编辑器界面如图,2-3,所示。,图,2-3,在数组编辑器中编辑矩阵,在命令行窗口中直接输入元素较多的向量或者矩阵时比较麻烦,
15、可以利用数组编辑器完成大矩阵的编辑,具体方法如下:,首先在命令行窗口中创建一个新的变量,可以为这个变量赋任意的数值,例如在,MATLAB,的命令行窗口中键入:,A=1,。,然后通过工作空间浏览器打开数组编辑器,并在数组编辑器中加载相应的变量。,在数组编辑器的工具栏中,分别修改矩阵的行数和列数,例如设置矩阵的行、列数分别为,14,行、,15,列,则数组编辑器将自动扩充矩阵,将未定义的元素赋初值为,0,,这时就可以双击任意元素来修改矩阵的元素值了,如图,2-4,所示,即逐个修改必要的元素,完成矩阵的定义。,图,2-4,利用数组编辑器定义矩阵,在数组编辑器中可以使用多种格式来显示数组中的数据,这些显
16、示数据的格式和在第一章中介绍,format,指令时介绍的数据格式完全一致。在图,2-5,中演示了利用,bank,格式显示数据的效果。,图,2-5,以,bank,格式显示数据,2.3.3,利用,M,文件建立矩阵,对于比较大且比较复杂的矩阵,可以为它专门建立一个,M,文件。下面通过一个简单例子来说明如何利用,M,文件创建矩阵。,例,利用,M,文件建立,MYMAT,矩阵。,(1),启动有关编辑程序或,MATLAB,文本编辑器,并输入待建矩阵:,(2),把输入的内容以纯文本方式存盘,(,设文件名为,mymatrix.m,),。,(3),在,MATLAB,命令窗口中输入,mymatrix,,即运行该,M
17、文件,就会自动建立一个名为,MYMAT,的矩阵,可供以后使用。,用于专门学科的特殊矩阵,(1),幻方,所谓幻方是,n,阶的方阵,其行元素和列元素的和都相等,.,幻方,矩阵有一个有趣的性质,其每行、每列及两条对角线上的元素和都相等。对于,n,阶,幻方,阵,其元素由,1,2,3,n2,共,n2,个整数组成。,MATLAB,提供了求,幻方,矩阵的函数,magic(n,),,其功能是生成一个,n,阶,幻方,阵。,例,将,101125,等,25,个数填入一个,5,行,5,列的表格中,使其每行每列及对角线的和均为,565,。,M=100+magic(5),(2),范得蒙矩阵,范得蒙,(,Vandermo
18、nde,),矩阵最后一列全为,1,,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。在,MATLAB,中,函数,vander(V,),生成以向量,V,为基础向量的范得蒙矩阵。例如,,A=vander(1;2;3;5),。,(3),希尔伯特矩阵,在,MATLAB,中,生成希尔伯特矩阵的函数是,hilb(n,),。使用一般方法求逆会因为原始数据的微小扰动而产生不可靠的计算结果。,MATLAB,中,有一个专门求希尔伯特矩阵的逆的函数,invhilb(n,),,其功能是求,n,阶的希尔伯特矩阵的逆矩阵。,例,求,4,阶希尔伯特矩阵及其逆矩阵。,命
19、令如下:,format rat%,以有理形式输出,H=hilb(4)H=invhilb(4),(4),托普利兹矩阵,托普利兹,(,Toeplitz,),矩阵除第一行第一列外,其他每个元素都与左上角的元素相同。生成托普利兹矩阵的函数是,toeplitz(x,y,),,它生成一个以,x,为第一列,,y,为第一行的托普利兹矩阵。这里,x,y,均为向量,两者不必等长。,toeplitz(x,),用向量,x,生成一个对称的托普利兹矩阵。例如,T=toeplitz(1:6),(5),伴随矩阵,MATLAB,生成伴随矩阵的函数是,compan(p,),,其中,p,是一个多项式的系数向量,高次幂系数排在前,低
20、次幂排在后。例如,为了求多项式的,x3-7x+6,的伴随矩阵,可使用命令:,p=1,0,-7,6;,compan(p,),(6),帕斯卡矩阵,我们知道,二次项,(,x+y)n,展开后的系数随,n,的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡,(Pascal),矩阵。函数,pascal(n,),生成一个,n,阶帕斯卡矩阵。,例,求,(x+y)5,的展开式。,在,MATLAB,命令窗口,输入命令:,pascal(6),矩阵次对角线上的元素,1,5,10,10,5,1,即为展开式的系数。,2.4,索 引,2.4.1,向量元素的访问,访问向量的元素只要使用相应元素的索引。
21、如在例,2-8,中操作对象是一个向量,该向量为,A=1 2 3 4 5 6 7 8 9 0,。,例,2-8,访问向量中的元素。,在,MATLAB,的命令行窗口中键入下面的指令:,%,访问向量的第三个元素,A(3),ans,=,3,%,访问向量的第一、三、七个元素,A(1 3 7),ans,=,1 3 7,%,访问向量的第一、三、五个元素,A(1:3:5),ans,=,1 3 5,%,访问向量的最后四个元素,A(end-3:end),ans,=,7 8 9 0,%,重复访问向量中的元素,A(1:5,5:-1:1),ans,=,1 2 3 4 5 5 4 3 2 1,说明:,*访问向量元素的结果是
22、创建新的向量。,*访问向量的元素直接给出元素在向量中的序号,元素的序号不仅可以是单一的整数,还可以是元素序号组成的向量,如例,2-8,中的各种操作。,*关键字,end,在访问向量元素时,表示向量中最后一个元素的序号。,*访问向量元素时,序号的数值必须介于数值,1,end,之间。,可以通过访问元素的方法,对具体的元素赋值,见例,2-9,。,例子,2-9,对向量的元素进行赋值。,在,MATLAB,命令行窗口中键入下面的指令:,%,对向量的第三个元素赋值,A(3)=-3,A=,1 2 -3 4 5 6 7 8 9 0,%,对向量中不存在的数据赋值,A(15)=-15,A=,Columns 1 thr
23、ough 10,1 2 -3 4 5 6 7 8 9 0,Columns 11 through 15,0 0 0 0 -15,说明:,在例,2-9,中,对向量的第,15,个元素赋值,在赋值之前向量的第,1115,个元素不存在,但是在赋值之后,将自动创建这些元素,并且为没有明确赋值的元素赋默认值,0,,这就是,MATLAB,的数据自动扩充和初始化机制。,2.4.2,矩阵元素的访问,访问矩阵的元素也需要使用矩阵元素的索引,不过具有两种方式,第一种方式是使用矩阵元素的行列全下标形式,第二种方法是使用矩阵元素的单下标形式。,例,2-10,访问矩阵的元素。,MATLAB,工作空间中具有一个,55,的矩阵
24、该矩阵是五阶的幻方,通过命令行获取矩阵的第二行、第四列的元素,键入下面的指令:,%,创建矩阵,A=magic(5),A=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,%,使用全下标的形式访问元素,A(2,4),ans,=14,%,使用单下标的形式访问元素,A(17),ans,=,14,说明:,*使用全下标的形式访问矩阵元素的方法简单、直接,同线性代数的矩阵元素的概念一一对应。,*矩阵元素的单下标是矩阵元素在内存中存储的序列号,一般地,同一个矩阵的元素存储在连续的内存单元中。,*矩阵元素的单下标与全下标之间的
25、转换关系如下,以,m,m,的矩阵为例,该矩阵的第,i,行第,j,列的元素全下标表示为单下标,l,=(,j,-1),m,+,i,。,注意:,MATLAB,的,矩阵元素的排列以列元素优先,,这一点同,FORTRAN,语言的二维数组元素的排列方法一致,与,C,语言的二维数组元素的排列不同,,C,语言的二维数组元素排列以行元素优先。,为了方便全下标和单下标之间的转换,,MATLAB,提供了两个函数分别完成两者之间的相互转化:,*,sub2ind,:,根据全下标计算单下标。,*,ind2sub,:,根据单下标计算全下标。,表,2-1,使用索引访问矩阵元素的方法,2,矩阵拆分,(1),利用冒号表达式获得子
26、矩阵,A(:,j,),表示取,A,矩阵的第,j,列全部元素;,A(i,:),表示,A,矩阵第,i,行的全部元素;,A(i,j,),表示取,A,矩阵第,i,行、第,j,列的元素。,A(i:i+m,:),表示取,A,矩阵第,i,i+m,行的全部元素;,A(:,k:k+m,),表示取,A,矩阵第,k,k+m,列的全部元素,,A(i:i+m,k:k+m,),表示取,A,矩阵第,i,i+m,行内,并在第,k,k+m,列中的所有元素。此外,还可利用一般向量和,end,运算符来表示矩阵下标,从而获得子矩阵。,end,表示某一维的末尾元素下标。,(2),利用空矩阵删除矩阵的元素 在,MATLAB,中,定义,为
27、空矩阵。给变量,X,赋空矩阵的语句为,X=,。,注意:,X=,与,clear X,不同,,clear,是将,X,从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为,0,。,例,2-11,用不同的方法访问矩阵的元素。,在,MATLAB,命令行中键入下面的指令:,%,创建矩阵,A=1:25;,A=reshape(A,5,5),A=,1 6 11 16 21,2 7 12 17 22,3 8 13 18 23,4 9 14 19 24,5 10 15 20 25,%,访问矩阵的第三行第一列元素,A(3,1),或,A(3),ans,=3,%,访问矩阵第三行的所有元素,A(3,:),ans,=3
28、8 13 18 23,%,访问矩阵第四列的所有元素,A(:,4),ans,=16,17,18,19,20,%,访问矩阵的最后一行元素,A(end,:),ans,=5 10 15 20 25,%,获取矩阵的子矩阵,I=1 3 5;J=2 4;,A(I,J),ans,=6 16,8 18,10 20,2.5,基 本 运 算,2.5.1,矩阵生成函数,表,2-2 MATLAB,的矩阵生成函数,例,分别建立,33,、,32,和与,A,同样大小的零矩阵,。,(1),建立一个,33,零矩阵。,zeros(3)(2),建立一个,32,零矩阵。,zeros(3,2)(3),设,A,为,23,矩阵,则可以用,z
29、eros(size(A,),建立一个与矩阵,A,同样大小零矩阵。,A=1 2 3;4 5 6;%,产生一个,23,阶矩阵,A,zeros(size(A,)%,产生一个与矩阵,A,同样大小的零矩阵,例 建立随机矩阵:,(1),在区间,20,50,内均匀分布的,5,阶随机矩阵。,(2),均值为,0.6,、方差为,0.1,的,5,阶正态分布随机矩阵。命令如下:,x=20+(50-20)*rand(5)y=0.6+sqrt(0.1)*randn(5),此外,常用的函数还有,reshape(A,m,n,),,它在矩阵总元素保持不变的前提下,将矩阵,A,重新排成,mn,的二维矩阵。,例,2-12,矩阵生成
30、函数的示例。,%,创建三阶帕斯卡矩阵,A=pascal(3),A=1 1 1,1 2 3,1 3 6,%,从矩阵,A,生成下三角矩阵,tril(A,),ans,=1 0 0,1 2 0,1 3 6,%,获取矩阵,A,的对角线元素,diag(A,),ans,=1,2,6,%,利用向量生成对角矩阵,diag(ans,),ans,=1 0 0,0 2 0,0 0 6,2.5.2,基本矩阵运算,针对矩阵的运算,MATLAB,提供了若干函数和基本的运算规则,这些规则和函数都分别和线性代数的基本概念和运算规则对应。矩阵的基本运算见表,2-3,。,表,2-3,矩阵的基本运算,提示:获取矩阵,(,线性代数,)
31、的运算函数列表,:,help,matfun,在,MATLAB,命令行窗口中将显示相应的函数列表:,Matrix functions-numerical linear algebra.,Matrix analysis.,norm -Matrix or vector norm.,normest,-Estimate the matrix 2-norm.,一般的,MATLAB,函数都可以针对矩阵进行运算,但是在前面的,help,命令行中显示的函数是专门针对矩阵和线性代数运算的函数。,例,2-13,矩阵的基本运算,求解方程组。,这类问题可以直接通过矩阵运算解决。,%,创建线性方程组的系数矩阵和向量,A
32、1 1 2;3-1 1;-1 3 4;,b=2;6;4;,%,求解方程,使用矩阵求逆的方法,x=inv(A)*b,x=1.0000,-1.0000,2.0000,%,求解方程,使用矩阵左除运算,x=Ab,x=1.0000,-1.0000,2.0000,从例,2-13,可以看出以矩阵为基本运算单位进行数值运算的优势。对,MATLAB,,,矩阵的基本运算都可以用一种最简单、直观的表达式完成,像这种利用向量或者矩阵的运算,不仅可以简化代码,还能够提高,M,语言的运行速度。,矩阵的运算同时也包含了矩阵和标量之间的运算,,MATLAB,在处理这种运算的时候,首先对标量进行扩充,如:,w=1 2;3
33、4+5,w=6 7,8 9,该指令行实际的执行过程如下:,w=1 2;3 4+5,2.5.3,基本数组运算,在,MATLAB,中,除了基本的线性代数运算以外,大多数的矩阵运算都适用于数组运算,但是有些运算不同,以下介绍基本运算指令和方法。,1,数组转置,数组转置的操作符是在矩阵转置操作符前加符号“,.”,。,例,2-14,数组转置操作。,%,创建矩阵,A=ones(2,3);A(:)=1:6,A=1 3 5,2 4 6,%,矩阵转置,A.,ans,=1 2,3 4,5 6,%,复数运算,矩阵,A,成为复数矩阵,A=A*I,A=,0+1.0000i 0+3.0000i 0+5.0000i,0+2
34、0000i 0+4.0000i 0+6.0000i,%,矩阵转置,A,ans,=0-1.0000i 0-2.0000i,0-3.0000i 0-4.0000i,0-5.0000i 0-6.0000i,%,数组转置,A.,ans,=0+1.0000i 0+2.0000i,0+3.0000i 0+4.0000i,0+5.0000i 0+6.0000i,从例,2-14,可以看出,对于实数矩阵,矩阵转置和数组转置的计算结果是一致的,但是对于复数矩阵,数组转置和矩阵转置的计算结果就不一致。所以,对于数组转置运算也被称为非共轭转置,矩阵转置运算则被称为共轭转置。,2,数组幂,数组幂运算符是在矩阵幂运算符
35、前加上符号“,.”.,例,2-15,数组幂运算。,%,本例子中使用的矩阵,A,A=0+1.0000i 0+3.0000i 0+5.0000i,0+2.0000i 0+4.0000i 0+6.0000i,%,矩阵幂运算,A3,?Error using=,Matrix must be square.,%,数组幂运算,A.3,ans,=1.0e+002*,0-0.0100i 0-0.2700i 0-1.2500i,0-0.0800i 0-0.6400i 0-2.1600i,3,数组乘法,和前面两种运算类似,数组乘法运算符是在矩阵乘法运算符前加上符号“,.”,。,例,2-16,数组乘法示例。,键入下面
36、的指令:,%,本例子中使用的矩阵,A,A=0+1.0000i 0+3.0000i 0+5.0000i,0+2.0000i 0+4.0000i 0+6.0000i,%,矩阵乘法,A*5,ans,=0+5.0000i 0+15.0000i 0+25.0000i,0+10.0000i 0+20.0000i 0+30.0000i,%,数组乘法,A.*5,ans,=0+5.0000i 0+15.0000i 0+25.0000i,0+10.0000i 0+20.0000i 0+30.0000i,%,矩阵乘法,A*A,ans,=35 44,44 56,%,数组乘法,A.*A,ans,=-1 -9 -25,-
37、4 -16 -36,2.5.4,基本数学函数,在,MATLAB,中有些函数可以用来进行基本的数学运算,主要有如下类别:三角函数,(,见表,2-4),、指数运算函数,(,见表,2-5),、复数运算函数,(,见表,2-6),、圆整和求余函数,(,见表,2-7),。需要注意的是这些函数的参数可以是矩阵也可以是向量或者多维数组,函数在处理参数时,都是按照数组运算的规则来进行的。,表,2-4,三 角 函 数,表,2-5,指数运算函数,说明:,以,real,开头的函数仅能处理实数,如输入的参数为复数,则,MATLAB,会报错。,函数,nextpow2,是用来计算仅仅比输入参数大的第一个,2,的幂,例如输入
38、参数为,N,,,则函数的计算结果整数,P,需要满足的条件为,2,P,abs,(,N,)2,P,-1,。,表,2-6,复 数 运 算,表,2-7,圆整和求余函数,例,2-17,圆整和求余函数。,键入下面的指令:,fix(-1.9),ans,=-1,floor(-1.9),ans,=-2,round(-1.9),ans,=-2,ceil(-1.9),ans,=,-1,上面比较了四种圆整函数处理同一个数据的结果,在使用不同的取整函数时要注意各个函数的特点。这四种圆整函数间的区别主要是进行圆整运算时,趋近的方向不同。如,fix,函数是将数据向,0,的方向趋近,而,floor,函数是向无穷大的方向上趋近
39、mod(9,-2),ans,=-1,rem(9,-2),ans,=,1,2.5.5,矩阵,(,数组,),操作函数,前面主要介绍了进行数学运算的,MATLAB,函数,在,MATLAB,中还存在一类函数用来获取矩阵或者数组的信息,以及对数组进行操作,在表,2-8,中列举了较常用的函数。完整的函数列表内容可以在,MATLAB,命令行中键入,help,elmat,指令来察看。,表,2-8,用于矩阵,(,数组,),操作的常用函数,例,2-18 reshape,函数的使用,例,2-11,中曾经使用过,reshape,函数,这里详细讨论该函数的用法,.,键入下面的指令:,A=1:8,A=1 2 3 4
40、5 6 7 8,B=reshape(A,2,4),B=,1 3 5 7,2 4 6 8,C=reshape(B,3,3),?Error using=reshape,To RESHAPE the number of elements must not change.,例,2-19,对称交换函数的使用,在,MATLAB,命令行中,键入下面的指令:,A=reshape(1:9,3,3),A=1 4 7,2 5 8,3 6 9,fliplr(A,),ans,=7 4 1,8 5 2,9 6 3,flipud(A,),ans,=3 6 9,2 5 8,1 4 7,在生成比较复杂的矩阵时,可以使用,MAT
41、LAB,提供的矩阵扩展方法完成相应矩阵的构造。假设矩阵,A,为三阶方阵,,B,为二阶方阵,由矩阵,A,和,B,组合构成五阶方阵 ,其中,O,为相应的零矩阵,具体的创建方法见例,2-20,。,例子,2-20,创建复杂矩阵,在,MATLAB,命令行中,键入下面的指令:,A=reshape(1:9,3,3);,B=1 2;3 4;,O=zeros(length(A),length(B),O=0 0,0 0,0 0,C=A O;O B,C=1 4 7 0 0,2 5 8 0 0,3 6 9 0 0,0 0 0 1 2,0 0 0 3 4,例子,2-21,使用方括号创建复杂矩阵。,在,MATLAB,命令
42、行中,键入下面的指令:,A=1 2;3 4;,B=A,A*2;,tril(A,),triu(A,);A*3,A*4,B=,1 2 2 4,3 4 6 8,1 0 1 2,3 4 0 4,3 6 4 8,9 12 12 16,tril,Extract lower triangular part(,提取下三角),.,tril(X,)is the lower triangular part of X.,triu,Extract upper triangular part.,triu(X,)is the upper triangular part of X.,例子,2-22,函数,repmat,的应用
43、repmat(magic(2),2,3),ans,=,1 3 1 3 1 3,4 2 4 2 4 2,1 3 1 3 1 3,4 2 4 2 4 2,repmat,函数的基本语法为,repmat(A,M,N,),,作用是将指定的矩阵,A,复制次,然后创建一个复杂的大矩阵,结果为,.,例,2-22,中,将一个简单的二行二列的矩阵进行了六次重复,创建了四行六列的大矩阵。,2.6,稀 疏 矩 阵,矩阵元素的表示方法是计算机数据结构理论中经常讨论的话题。在实际工作中经常遇到这样一类矩阵,这类矩阵中数值为,0,的元素居多,一般称为稀疏矩阵。如果使用满阵的方式来表示稀疏矩阵,则,0,元素将占用相当的内存
44、空间,特别是由于,MATLAB,默认的数据类型是双精度类型,每一个双精度类型的数据元素都要占用八个字节的内存空间,当,0,元素很多的时候将占用相当可观的内存空间,因此,MATLAB,中专门提供了稀疏矩阵的表示方法。,例,2-23,创建稀疏矩阵。,在,MATLAB,命令行窗口中键入下面的指令:,A=eye(5),A=,1 0 0 0 0,0 1 0 0 0,0 0 1 0 0,0 0 0 1 0,0 0 0 0 1,B=sparse(A),B=(1,1)1,(2,2)1,(3,3)1,(4,4)1,(5,5)1,whos,Name Size Bytes Class,A 5x5 200 doubl
45、e array,B 5x5 84 double array(sparse),Grand total is 30 elements using 284 bytes,在例,2-23,中,首先使用,eye,函数创建了五阶的单位矩阵,五阶单位方阵一共有,25,个元素,其中却有,20,个元素是,0,。使用,sparse,函数构造成为稀疏矩阵,得到矩阵,B,。,通过,whos,指令可以清晰地比较两个矩阵占用的内存空间,,A,矩阵占用了,200,个字节,而,B,矩阵仅占用了,84,个字节。,稀疏矩阵和普通矩阵,(,满阵,),之间可以直接进行运算,例如,A+B,ans,=2 0 0 0 0,0 2 0 0 0
46、0 0 2 0 0,0 0 0 2 0,0 0 0 0 2,在进行稀疏矩阵运算的时候要注意,,运算得到的结果是一个满阵。,MATLAB,中使用“三元组”表示法来表示稀疏矩阵,该表示方法一般由三个向量组成:第一个向量是由矩阵中非零元素组成的向量,其长度一般为,nzmax,,,即矩阵中所有非零元素的个数;第二个向量是非零元素的行序号,该向量的长度也为,nzmax,;,第三个向量是非零元素的列序号,该向量的长度也为,nzmax,。,例 对稀疏矩阵:,因此,表示矩阵的三个向量分别为,data=15 91 11 3 28 22 6 15;,ir,=1 5 2 2 6 1 3 1;,jc,=1 1 2
47、3 3 4 4 6;,利用上面的三个矩阵和,sparse,函数创建六行六列的稀疏矩阵:,S=sparse(ir,jc,data,6,6),S=(1,1)15,(5,1)91,(2,2)11,(2,3)3,(6,3)28,(1,4)22,(3,4)-6,(1,6)-15,%,将该矩阵还原成满阵,full(S),ans,=,15 0 0 22 0 -15,0 11 3 0 0 0,0 0 0 -6 0 0,0 0 0 0 0 0,91 0 0 0 0 0,0 0 28 0 0 0,whos,Name Size Bytes Class,S 6x6 124 double array(sparse),a
48、ns,6x6 288 double array,data 1x8 64 double array,ir,1x8 64 double array,jc,1x8 64 double array,Grand total is 68 elements using 604 bytes,注意:,在不同的语言或者数学计算软件中表示稀疏矩阵的方法可能不尽相同。,MATLAB,专门提供了若干函数用于稀疏矩阵的运算,在表,2-9,中对这些函数进行了总结。,提示:,在,MATLAB,命令行窗口中键入指令,help,sparfun,可以得到稀疏矩阵运算函数的列表。,表,2-9,稀疏矩阵的常用函数,2.7,多 维 数
49、组,2.7.1,创建多维数组,多维数组的创建也有多种方法:第一种方法是使用直接赋值;第二种方法是使用部分,MATLAB,的函数。,例,2-24,使用直接赋值的方法创建多维数组,A=pascal(4),A=1 1 1 1,1 2 3 4,1 3 6 10,1 4 10 20,A(:,:,2)=eye(4),A(:,:,1)=1 1 1 1,1 2 3 4,1 3 6 10,1 4 10 20,A(:,:,2)=,1 0 0 0,0 1 0 0,0 0 1 0,0 0 0 1,A(:,:,3)=magic(5),?Subscripted assignment dimension mismatch.
50、在例,2-24,中,首先创建了一个矩阵,帕斯卡矩阵将其看作二维数组,然后使用全下标的形式创建了三维数组的第二页,第二页上的矩阵是一个单位阵,接着在创建新的一页时使用了五阶方阵作为输入,由于维数不匹配所以系统报错。,例,2-25,使用直接赋值的方法创建多维数组,B(3,3,3)=1,B(:,:,1)=0 0 0,0 0 0,0 0 0,B(:,:,2)=0 0 0,0 0 0,0 0 0,B(:,:,3)=0 0 0,0 0 0,0 0 1,例,2-26,使用函数创建多维数组,在,MATLAB,命令行中,键入下面的指令:,rand(3,3,3),ans(:,:,1)=0.9501 0.4860






