数组和矩阵分析.ppt
第3章 数组和矩阵分析,MATLAB语言最基本和最重要的功能就是进行矩阵运算,所有的数值功能都以矩阵为基本单元来实现。本章将对MATLAB中的数组和矩阵及其运算进行详细的介绍。,3.1 数组及其函数,下面介绍MATLAB中如何建立数组,以及数组的常用操作等,包括数组的算术运算、关系运算和逻辑运算,以及数组信息的获取等。,3.1.1 数组的建立和操作,在MATLAB中,一般使用方括号()、逗号(,)、空格及分号(;)来创建数组。数组中同一行的元素之间用逗号或空格进行分割,不同行之间用分号进行分割。需要注意的是,这些符号都必须在英文输入状态下输入。空数组是MATLAB中最特殊的数组,不含有任何元素,可以用于数组的声明或者清空等。创建空数组非常简单,只要把变量赋值为一对方括号即可。数组是有方向的,一维数组包括行向量和列向量,行向量是以行方向分布的,列向量是以列方向分布的。创建一维行向量,把所有用空格或逗号分割的元素用方括号括起来;创建一维列向量,把所有用分号分割的元素用方括号括起来。,3.1.2 数组的算术运算,数组运算是从数组的单个元素出发,针对每个元素进行的运算。在MATLAB中,一维数组的基本算术运算有:(加)、(减)、.*(乘)、./(左除)、.(右除)和(乘方)等。,数组的加减运算规则:若数组A和B的维数相同,则可以执行加减运算,相应元素相加减。如果A和B的维数不相同,则MATLAB将给出错误信息,提示用户两个数组的维数不匹配。,3.1.2 数组的算术运算,在MATLAB中,数组的乘法和除法分别用“.*”和“./”表示。如果数组A和B具有相同的维数,则数组的乘法表示数组A和B中对应的元素相乘,数组的除法表示数组A和B中对应的元素相除。,右除和左除的关系为:A./B=B.A,其中是A被除数,B是除数。,3.1.3 数组的关系运算,MATLAB提供了6种关系运算符:(大于)、=(大于或等于)、=(恒等于)、=(不等于)。它们的含义很容易理解,需要注意的是其书写方法与数学中的不等式符号不尽相同。,当参与比较的量是两个维数相同的数组时,比较两数组相同位置的元素,并给出比较结果。最终的关系运算的结果是一个维数与原矩阵相同的数组,由0或1组成。当参与比较的一个是标量,而另一个是数组时,则把标量与数组的每一个元素逐个比较,最终的关系运算的结果是一个维数与原数组相同的数组。,3.1.4 数组的逻辑运算,在MATLAB中,提供了3种逻辑运算符,分别是&(逻辑与)、|(逻辑或)和(逻辑非)。在逻辑运算中,如果为非零元素则为逻辑真,用1表示,零元素为逻辑假,用0表示。,3.1.3 数组信息的获取,下面介绍如何获取数组的信息,包括数组大小、维度、数据类型、内存占用,以及数组的元素查找和排序等。,函数isempty(A):该函数检测数组是否为空,如果为空,返回值为1,否则,返回值为0。函数isscalar(A)检测数组是否为单个元素的标量。函数isvector(A)检测数组是否为行向量或列向量。函数isrow()检测数组是否为列向量。函数iscolum()检测数组是否为行向量。函数issparse()检测数组是否为稀疏矩阵。,3.1.3 数组信息的获取,下面介绍如何获取数组的信息,包括数组大小、维度、数据类型、内存占用,以及数组的元素查找和排序等。,函数isempty(A):该函数检测数组是否为空,如果为空,返回值为1,否则,返回值为0。函数isscalar(A)检测数组是否为单个元素的标量。函数isvector(A)检测数组是否为行向量或列向量。函数isrow()检测数组是否为列向量。函数iscolum()检测数组是否为行向量。函数issparse()检测数组是否为稀疏矩阵。,3.1.3 数组信息的获取,在MATLAB中,最常用的检测数组大小的函数是size()和length()。,函数size()获取数组的行数和列数,函数length()获取一维数组的长度,如果是二维数组,则返回行数和列数中的较大者。,函数ndims()计算数组的维度。,3.1.3 数组信息的获取,在MATLAB中,可以采用函数whos来获取数组的大小,以及占用内存的多少。对于数组中不同的数据类型,占用的内存也不一样。,在MATLAB中,数组元素的查找采用函数find(),返回关系表达式为真的元素的下标。,在MATLAB中,数组的排序使用函数sort(),该函数默认按照升序排列,返回值为排序后的数组,和原数组维数相同。,3.2 矩阵的创建,矩阵的创建有多种方式,最简单的是在命令窗口中直接输入矩阵,比较适合创建比较小的矩阵。把矩阵的元素放到方括号里面,每行的元素用空格或逗号分割,每列用分号分割。需要注意的是每行的元素数必须相等,每列的元素数也必须相等。此外,还可以通过语句和函数生成矩阵,例如函数eye()用于生成单位矩阵。另外,还可以通过M文件来建立矩阵,以及从外部数据文件中导入矩阵,例如通过函数imread()读取图片,从而得到图像数据的二维矩阵。,3.2 矩阵的创建,在MATLAB中,矩阵的元素按照列进行保存,先第一列,再第二列,直到结束。矩阵中的元素可以采用单下标获取,也可以采用双下标获取。单下标和双下标之间,可以通过MATLAB提供的函数sub2ind()和ind2sub()进行转换。在程序中,对矩阵中的元素进行赋值。如果行或者列超出矩阵的大小,则MATLAB自动扩充矩阵的大小,然后再进行赋值,扩充部分用零填充。,3.3 矩阵的基本操作,在MATLAB中,矩阵是基本的计算单元,有很多关于矩阵操作的函数。下面介绍常用的矩阵的扩展、块操作、转置、旋转和翻转,以及改变矩阵的大小等。,3.3.1 矩阵的扩展,在MATLAB中,可以通过数组的扩展,将多个小矩阵转换为大的矩阵。进行数组连接的函数有函数cat()、函数vertcat()和函数horzcat()。下面对这些函数进行介绍:C=cat(DIM,A,B):该函数在DIM维度上进行矩阵A和B的连接,返回值为连接后的矩阵。C=vertcat(A,B):该函数在水平方向上连接数组A和B,相当于cat(1,A,B)。C=horzcat(A,B):该函数在垂直方向上连接数组A和B,相当于cat(2,A,B)。,3.3.2 矩阵的块操作,在MATLAB中,通过函数repmat()、函数blkdiag()和函数kron()进行矩阵的块操作,下面分别进行介绍。在MATLAB中,通过函数repmat()进行数据块的复制,该函数的调用格式为:B=repmat(A,m,n):该函数产生大的矩阵B,把矩阵A当作单个元素,产生由m行和n列的矩阵A组成的大矩阵B。B=repmat(A,m):该函数产生大的矩阵B,把矩阵A当作单个元素,产生m行和m列的矩阵A组成的大矩阵B。,3.3.2 矩阵的块操作,在MATLAB中,采用函数blkdiag()将多个矩阵作为对角块,产生新的矩阵。该函数的调用格式为:Y=blkdiag(A,B):该函数将矩阵A和B作为对角块,产生新的矩阵Y。Y=blkdiag(A,B,):该函数将多个矩阵作为对角块,产生新的矩阵。,3.3.3 矩阵中元素的删除,在MATLAB中,利用空矩阵删除矩阵的元素。在MATLAB中,空矩阵为一对方括号()。矩阵赋值为空矩阵的语句为X=。注意,X=与clear X不同,clear是将X从工作空间中删除,而空矩阵则存在于工作空间中,只是维数为0。,3.3.4 矩阵的转置,在MATLAB中进行矩阵的转置,最简单的是采用转置操作符(),从而实现矩阵A的Hermition转置为A。如果矩阵中含有复数,则进行矩阵转置后,复数转化为共轭复数。矩阵的真正转置为A.,即使为复数,也不转换为共轭。也可以采用函数transpose(A)来实现,两者完全一致。,3.3.5 矩阵的旋转,在MATLAB中,矩阵的旋转可以采用转置的方法,也可以采用函数rot90()。该函数的调用格式为:B=rot90(A):该函数将矩阵逆时针旋转90度。B=rot90(A,k):该函数将矩阵逆时针旋转90度的k倍,k的默认值为1。,3.3.6 矩阵的翻转,对矩阵实施左右翻转是将原矩阵的第一列和最后一列调换,第二列和倒数第二列调换,依次类推。在MATLAB中,对矩阵进行左右翻转的函数是fliplr(A),实现矩阵的左右翻转。对矩阵进行上下翻转是将原矩阵的第一行和最后一行调换,第二行和倒数第二行调换,依次类推。在MATLAB中,对矩阵进行上下翻转的函数是flipud(A),实现矩阵的上下翻转。此外,还可以采用函数flipdim()进行矩阵的翻转,该函数的调用格式为:flipdim(A,k),该函数在指定的方向k进行矩阵的翻转。当k=1时,相当于flipud(A),当时k=2,相当于fliplr(A)。,3.3.7 矩阵尺寸的改变,在矩阵总元素保持不变的前提下,在MATLAB中才用函数reshape()改变矩阵的尺寸。该函数的调用格式为:Y=reshape(X,m,n),将矩阵转换为m行n列的二维矩阵。矩阵的总元素数不变。,3.4 矩阵的基本数值运算,矩阵的基本数值计算包括矩阵的加法、减法、乘法和除法,以及矩阵元素的查找、排序、求和和求积等。下面分别进行介绍。,3.4.1 矩阵的加减运算,假定有两个矩阵A和B,则可以由A+B和A-B实现矩阵的加减运算,要求矩阵A和B的维数必须相同。矩阵的加法和减法是矩阵中对应元素加减。如果和中有一个为标量,则将矩阵中的每一个元素和该标量进行加减运算。,3.4.2 矩阵的乘法,在MATLAB中,矩阵A和B的乘法为A*B,要求矩阵A的列数和矩阵B的行数必须相等。此外,矩阵A和B的点乘为A.*B,表示矩阵A和B中对应元素相乘,要求矩阵A和B具有相同的维数,返回结果和原矩阵有相同的维数。如果A和B的维数不满足要求,系统会给出出错信息,提示两个数组的维数不匹配。,3.4.3 矩阵的除法,在MATLAB中,矩阵的除法有左除和右除两种,分别用“”和“/”表示。通常矩阵的除法用来求解方程组的解。一般情况下,矩阵A和B的左除为X=AB,表示方程组A*X=B的解。矩阵A和B的右除为X=B/A,表示线性方程组X*A=B的解。如果X不存在或不唯一,则系统显示警告信息。此外,还有矩阵的点除,采用“./”或“.”表示,表示两个矩阵中对应元素相除。,3.4.4 矩阵元素的查找,在MATLAB中,采用函数find()进行矩阵元素的查找。函数find()通常和关系运算和逻辑运算相结合,能够对矩阵中的元素进行查找。该函数的调用格式为:i=find(A):该函数查找矩阵中的非零元素,函数返回这些元素的单下标。i,j=find(A):该函数查找矩阵中的非零元素,函数返回这些元素的双下标和。,3.4.5 矩阵元素的排序,在MATLAB中,矩阵元素的排序使用函数sort(),该函数默认按照升序排列,返回排序后的矩阵。Y=sort(X):该函数对矩阵按照升序进行排列。当X为向量时,返回由小到大排序后的向量;当X为矩阵时,返回X中各列按照由小到大排序后的矩阵。Y=sort(X,DIM):该函数返回在给定的维数上的按照由小到大的顺序排序后的结果,当DIM=1时,按照列进行排序,当DIM=2时,按照行进行排序。Y=sort(X,DIM,MODE):该函数可以指定排序的方式。参数MODE默认值为ascend,即按照升序进行排列;当MODE为descend时,对矩阵进行降序排列。,3.4.6 矩阵元素的求和,在MATLAB中,进行矩阵中元素求和时采用函数sum()和cumsum()。其调用格式为:Y=sum(X):该函数对矩阵X的元素求和,返回矩阵中各列元素的和组成的向量。Y=sum(X,DIM):该函数返回在给定的维数DIM上的元素的和,当DIM=1时,计算矩阵各列元素的和,当DIM=2时,得到矩阵各行元素的和。函数cumsum()的调用格式和函数sum()类似,不同之处是函数cumsum()的返回值为矩阵。,3.4.7 矩阵元素的求积,在MATLAB中,进行矩阵中元素求积时采用函数prod()和cumprod()。其调用格式为:Y=prod(X):该函数对矩阵的元素求积,返回矩阵X中各列元素的积组成的向量。Y=prod(X,DIM):该函数返回在给定的维数上的元素的积,当DIM=1时,计算矩阵各列元素的积,当DIM=2时,得到矩阵各行元素的积。函数cumprod()的调用格式和函数prod()类似,不同之处是函数cumprod()的返回值为矩阵。,3.4.8 矩阵元素的差分,在MATLAB中,利用函数diff()计算矩阵的差分,该函数的调用格式为:Y=diff(X):该函数计算矩阵各列的差分。Y=diff(X,N):该函数计算矩阵各列的N阶差分。Y=diff(X,N,DIM):该函数计算矩阵在方向DIM上的N阶差分。当DIM=1时,计算矩阵各列元素的差分,当DIM=2时,得到矩阵各行元素的差分。,3.5 特殊矩阵的生成,在MATLAB中,有许多用于创建矩阵的函数。通过这些函数可以创建二维矩阵,甚至更高维的矩阵。下面对这些产生通用特殊矩阵的函数进行介绍。,3.5.1 全零矩阵,在MATLAB中,采用函数zeros()产生全零矩阵,该函数的调用格式为:A=zeros(N):该函数产生N行N列的全零矩阵。A=zeros(M,N):该函数产生M行N列的全零矩阵。A=zeros(M,N,P,):该函数产生M*N*P*的全零矩阵。A=zeros(size(B):该函数产生和矩阵B维数相同的全零矩阵。,3.5.2 全1矩阵,在MATLAB中,采用函数ones()产生全1矩阵,该函数的调用格式和函数zeros()基本一致。,3.5.3 单位矩阵,在MATLAB中,采用函数eye()产生单位矩阵,该函数的调用格式为:A=eye(N):该函数产生N行N列的单位矩阵。A=zeros(M,N):该函数产生M行N列的矩阵,对角线元素为1,其余元素均为0。A=zeros(size(B):该函数产生和矩阵B维数相同的单位矩阵。,3.5.4 01间均匀分布的随机矩阵,在MATLAB中,采用函数rand()产生01之间均匀分布的随机矩阵,该函数的调用格式为:A=rand(N):该函数产生N行N列的01之间均匀分布的随机矩阵。A=rand(M,N):该函数产生M行N列的01之间均匀分布的随机矩阵。A=rand(M,N,P,):该函数产生M*N*P*的01之间均匀分布的随机矩阵。A=rand(size(B):该函数产生和矩阵B维数相同的01之间均匀分布的随机矩阵。,3.5.5 标准正态分布随机矩阵,在MATLAB中,采用函数randn()产生均值为0,方差为1的标准正态分布随机矩阵。该函数的调用格式和函数rand()基本一致。,3.5.6 魔方矩阵,魔方矩阵中每行、每列及两条对角线上的元素和都相等。对于n阶魔方阵,其元素由1,2,3,n2组成,共n2个整数。在MATLAB中,通过函数magic(n),求n阶魔方矩阵。,3.5.7 范得蒙矩阵,范得蒙(Vandermonde)矩阵最后一列全为1,倒数第二列为一个指定的向量,其他各列是其后列与倒数第二列的点乘积。可以用一个指定向量生成一个范得蒙矩阵。在MATLAB中,通过函数vander(V)生成以向量V为基础向量的范得蒙矩阵。,3.5.8 希尔伯特矩阵,在MATLAB中,通过函数hilb()生成希尔伯特(Hilbert)矩阵。该函数的调用格式为:hilb(n),产生n阶的希尔伯特矩阵。希尔伯特矩阵是一种病态矩阵,矩阵中任何一个元素发生微小的变化,整个矩阵的值和逆矩阵都发生巨大的变化。MATLAB中,通过函数函数invhilb()求希尔伯特矩阵的逆矩阵,该函数的调用格式为:invhilb(n),该函数产生n阶希尔伯特矩阵的逆矩阵。,3.5.9 托普利兹矩阵,托普利兹(Toeplitz)矩阵除第一行和第一列外,其它每个元素都与左上角的元素相同。在MATLAB中,通过函数toeplitz()生成托普利兹矩阵。该函数的调用格式为:toeplitz(x):该函数用向量x生成一个对称托普利兹矩阵。toeplitz(x,y):该函数产生一个以x为第一列,y为第一行的托普利兹矩阵。x和y均为向量,两者不必等长。需要注意的是,向量x和y的第一个元素必须相等。,3.5.10 伴随矩阵,在MATLAB中,通过函数compan()产生伴随矩阵,该函数的调用格式为:compan(p),其中p为多项式的系数向量,高次幂系数排在前,低次幂排在后。,3.5.11 帕斯卡矩阵,二次项展开后的系数随n的增大组成一个三角形表,称为杨辉三角形。由杨辉三角形表组成的矩阵称为帕斯卡(Pascal)矩阵。该函数的调用格式为:pascal(n),产生一个n阶的帕斯卡矩阵。,3.6 矩阵的特征和线性代数,下面介绍矩阵的一些基本操作,包括矩阵的特征值、三角阵、对角阵、矩阵的翻转等,以及矩阵的一些特征,例如矩阵的秩、矩阵的迹和矩阵的范数等。最后介绍了矩阵的超越函数。,3.6.1 方阵的行列式,把一个方阵看作一个行列式,并对其按行列式的规则求值,这个值就称为矩阵所对应的行列式的值。在MATALB中,采用函数det()求方阵的行列式,该函数的调用格式为:det(X),得到方阵X的行列式。,3.6.2 特征值、特征向量和特征多项式,在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(),该函数的调用格式为:E=eig(A):求矩阵A的全部特征值,组成向量E。V,D=eig(A):该函数计算矩阵的特征值和特征向量,返回值V和D为两个方阵。方阵V的每一列为一个特征向量,方阵D为对角矩阵,对角线上的元素为特征值。,3.6.3 对角阵,只有对角线上有非0元素的矩阵称为对角矩阵,对角线上的元素相等的对角矩阵称为数量矩阵,对角线上的元素都为1的对角矩阵称为单位矩阵。在MATLAB中,通过函数diag()获取矩阵的对角线元素,该函数的调用格式为:diag(A):该函数用于提取矩阵A的主对角线元素,产生一个列向量。diag(A,k):该函数提取第k条对角线的元素,组成一个列向量。,3.6.4 上三角阵和下三角阵,三角阵可以分为上三角阵和下三角阵,所谓上三角阵,即矩阵的对角线以下的元素全为0的矩阵,而下三角阵则是对角线以上的元素全为0的一种矩阵。在MATLAB中,通过函数triu()获取矩阵的上三角矩阵,该函数的调用格式为:triu(A),该函数返回矩阵A的上三角矩阵。triu(A,k):该函数返回矩阵A的第k条对角线以上的元素。在MATLAB中,采用函数tril()求矩阵的下三角矩阵,该函数的调用格式和函数triu()完全相同,这里不再赘述。,3.6.5 矩阵的逆和伪逆,对于方阵A,如果存在一个与其同阶的方阵B,使得A*B=B*A=E,则称A和B互为逆矩阵。采用函数inv()求方阵的逆矩阵。如果矩阵A不是一个方阵,或者是一个非满秩方阵时,没有逆矩阵,但可以找到一个与A的转置矩阵同型的矩阵B,使得:此时,称矩阵B为矩阵A的伪逆,也称为广义逆矩阵。在MATLAB中,求矩阵的广义逆矩阵的函数是pinv()。该函数的调用格式为:pinv(A),该函数计算矩阵A的广义逆矩阵。,3.6.6 矩阵的秩,矩阵的秩包括行秩和列秩,行秩和列秩相等。行秩为矩阵的行向量组成的极大无关组中行向量的个数,列秩为矩阵的列向量组成的极大无关组中列向量的个数。矩阵的秩反映了矩阵中各行向量之间和各列向量之间的线性关系。对于满秩矩阵,秩等于行数或列数,其各行向量或列向量都线性无关。在MATLAB中,通过函数rank()求矩阵的秩。该函数的调用格式为:rank(A),该函数求矩阵的秩。,3.6.7 矩阵的迹,矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。在MATLAB中,通过函数trace()求矩阵的迹。该函数的调用格式为:trace(A),求矩阵的迹。,3.6.8 矩阵的范数,矩阵的范数常用的有3种。在MATLAB中,求矩阵范数的函数为norm(),该函数的调用格式为:norm(X)或norm(X,2):计算矩阵的2-范数,返回矩阵的最大奇异值。norm(X,1):计算矩阵的1-范数,返回矩阵的的列向元素和的最大值。norm(X,inf):计算矩阵的-范数,返回矩阵的行向元素和的最大值。norm(X,fro):该函数计算矩阵的Frobenius范数。,3.6.9 矩阵的条件数,矩阵的条件数是用来判断矩阵病态的一个量,矩阵的条件数越大,表明该矩阵越病态,否则该矩阵越良态。Hilbert矩阵就是有名的病态矩阵。在MATLAB中,通过函数cond()求矩阵的条件数,该函数的调用格式为:cond(X,1):该函数计算矩阵X的1-范数下的条件数。cond(X)或cond(X,2):该函数计算矩阵X的2-范数数下的条件数。cond(X,inf):该函数计算矩阵X的-范数下的条件数。,3.6.10 矩阵的标准正交基,在MATLAB中,通过函数orth()得到矩阵的标准正交基,该函数的调用格式为:B=orth(A),矩阵B的列向量组成了矩阵A的一组标准正交基。,3.6.11 矩阵的超越函数,下面介绍矩阵的超越函数,主要包括:函数sqrtm()、函数logm()、函数expm()和函数funm()。函数sqrtm()用于计算矩阵的平方根。函数logm()用于计算矩阵的自然对数。函数expm()用于求矩阵的指数。函数funm()用于计算矩阵的超越函数值。,3.7 稀疏矩阵,在MATLAB中,对于矩阵的存储有两种方式:完全存储方式和稀疏存储方式。完全存储方式是将矩阵的全部元素按照矩阵的列存储。以前讲到的矩阵的存储方式都是按这个方式存储的。如果矩阵中的元素只有少数不是零,会浪费大量的存储空间。下面介绍矩阵的稀疏存储。,3.7.1 矩阵存储方式,稀疏存储矩阵只是矩阵的存储方式不同,它的运算规则与普通矩阵是一样的。用户可以创建整型、双精度、复数类型和逻辑类型的稀疏矩阵。稀疏矩阵不能自动生成。定义在完全存储方式下的运算只能产生完全存储的矩阵,不论多少个元素为0。在运算过程中,稀疏存储矩阵可以直接参与运算,产生的结果也是稀疏矩阵。,3.7.2 产生稀疏矩阵,在MATLAB中,通过函数sparse()把普通矩阵转换为稀疏矩阵,该函数的调用格式为:S=sparse(A),该函数将矩阵A转换为稀疏矩阵S。当矩阵A是稀疏存储方式时,则函数调用相当于S=A。S=sparse(m,n):该函数产生大小为m行n列,所有元素都是0的稀疏矩阵。在MATLAB中,通过函数full()把稀疏矩阵转换为普通矩阵,该函数的调用格式为:B=full(A),该函数将稀疏矩阵A转换为普通矩阵B。,3.7.2 产生稀疏矩阵,在MATLAB中,通过函数sparse()把普通矩阵转换为稀疏矩阵,该函数的调用格式为:S=sparse(A),该函数将矩阵A转换为稀疏矩阵S。当矩阵A是稀疏存储方式时,则函数调用相当于S=A。S=sparse(m,n):该函数产生大小为m行n列,所有元素都是0的稀疏矩阵。在MATLAB中,通过函数full()把稀疏矩阵转换为普通矩阵,该函数的调用格式为:B=full(A),该函数将稀疏矩阵A转换为普通矩阵B。,3.7.2 产生稀疏矩阵,在MATLAB中采用函数nnz(S)计算稀疏矩阵S中非零值的个数。通过函数spy()对稀疏矩阵中非零元素的分布进行图形化显示。获取稀疏矩阵中非零元素的密度。在MATLAB中,采用函数spalloc()为稀疏矩阵分配空间。,3.7.3 特殊稀疏矩阵,单位矩阵只有对角线元素为1,其它元素都为0,是一种具有稀疏特征的矩阵。在MATLAB中,函数eye()产生一个完全存储方式的单位矩阵。在MATLAB中,还有一个产生稀疏存储方式的单位矩阵的函数speye()。该函数的调用格式为:S=speye(n)产生一个n行n列的单位稀疏存储矩阵。S=speye(m,n)产生一个m行n列的单位稀疏存储矩阵。,3.7.3 特殊稀疏矩阵,函数spones()将稀疏矩阵中的非零元素替换为1。通过函数spconvert()将普通矩阵转换为稀疏矩阵。,3.8 矩阵的分解,矩阵分解是指根据一定的原理用某种算法将一个矩阵分解成若干个矩阵的乘积。常见的矩阵分解有Cholesky分解、LU分解、QR分解,以及Schur分解和Hessenberg分解等。下面分别进行介绍。,3.8.1 Cholesky分解,对于正定矩阵,可以分解为上三角矩阵和下三角矩阵的乘积,这种分解称为Cholesky分解。并不是所有的矩阵都可以进行Cholesky分解。能够进行Cholesky分解的矩阵必须是正定的,矩阵的所有对角元素必须是正的,同时矩阵的非对角元素不能太大。在MATLAB中,通过函数chol()进行矩阵的Cholesky分解。在采用函数chol()进行Cholesky分解时,最好先通过函数eig()得到矩阵的所有特征值,检查特征值是否为正。,3.8.2 LU分解,高斯消去法又称为LU分解,将方阵A分解为下三角矩阵的置换矩阵L和上三角矩阵U的乘积。在MATLAB中,通过函数lu()进行矩阵的LU分解。该函数的调用格式为:L1,U1=lu(A):该函数将矩阵分解为下三角矩阵的置换矩阵L1和上三角矩阵U1。L2,U2,P=lu(A):该函数将矩阵分解为下三角矩阵L2和上三角矩阵U2,以及置换矩阵P。Y=lu(A):该函数将下三角矩阵和上三角矩阵合并在矩阵Y中,矩阵Y的对角元素为上三角矩阵的对角元素。,3.8.3 QR分解,矩阵的正交分解,又称为QR分解。QR分解将一个m行n列的矩阵A分解为一个正交矩阵Q(m行m列)和一个上三角矩阵R(大小为m行n列)的乘积。在MATLAB中,通过函数qr()进行矩阵的QR分解。该函数的调用格式为:Q,R=qr(A),该函数将矩阵A进行QR分解,返回正交矩阵Q和上三角矩阵R。,3.8.4 SVD分解,奇异值分解在矩阵分析中非常重要,也是常用的矩阵分解之一。在MATLAB中,通过函数svd()进行矩阵的svd分解(或奇异值分解)。s=svd(A):该函数对矩阵A进行奇异值分解,返回由奇异值组成的列向量,奇异值按照从大到小的顺序进行排列。U,S,V=svd(A):该函数对矩阵进行奇异值分解,其中U和V为酉矩阵,S为一个对角矩阵,对角线的元素为矩阵的奇异值的降序排列。,3.8.5 Schur分解,对矩阵A的Schur分解公式为:A=U*S*U,矩阵A必须是方阵,U为酉矩阵,S为块对角矩阵。在MATLAB中,通过函数schur()进行矩阵的Schur分解。该函数的调用格式为:U,S=schur(A):该函数将矩阵A进行Schur分解,返回酉矩阵U和块对角矩阵S。S=schur(A):该函数仅返回块对角矩阵S。,3.8.6 Hessenberg分解,对于任意一个n阶方阵可以进行Hessenberg分解,分解公式为:A=PHP,其中P是酉矩阵,H的第一子对角线下的元素均为0,即H为Hessenberg矩阵。在MATLAB中,采用函数hess()进行方阵的Hessenberg分解,该函数的调用格式为:H=hess(A):该函数对方阵A进行Hessenberg分解,返回Hessenberg矩阵。P,H=hess(A):该函数对方阵A进行Hessenberg分解,返回值为P和H,满足A=PHP。,3.9 本章小结,本章对数组和矩阵进行了详细的介绍,重点讲解了矩阵的建立、矩阵的特征和分解、以及稀疏矩阵等内容。读者需要多加练习,对这些函数进行更为深入的理解。,