第二节矩阵及其运算矩阵及其运算MATLAB语言是由早期专门用于矩阵运算的计算机语言发展而来的,其名称就是“矩阵实验室”的缩写。MATLAB语言最基本、最重要的功能就是进行实数矩阵或是复数矩阵的运算,其所有的数值功能都以矩阵为基本单元来实现。矩阵是MATLAB的重要组成部分,将对矩阵及其运算进行详细介绍。矩阵及其运算一矩阵的生成(1)命令窗口直接输入;(2)通过语句和函数产生矩阵;(3)在M文件中建立;(4)从外部的数据文件中导入矩阵最常用的是在命令窗口中直接输入矩阵。方式:把矩阵的元素直接排列到方括号中,每行内的元素用空格或者逗号相隔,行与行之间的内容用分号相隔。矩阵及其运算二矩阵的基本数值运算矩阵的基本运算通常包含有矩阵与常数的四则运算、矩阵与矩阵之间的的四则运算以及矩阵的逆运算等。本节将要对矩阵的这些运算作简要的介绍。1矩阵与常数的四则运算矩阵与常数的四则运算即是指矩阵各元素与常数之间的四则运算。在矩阵与常数进行除法运算时,常数只能作为除数。例二如下:矩阵及其运算2矩阵之间的四则运算(1)矩阵与矩阵的加法(减法)矩阵与矩阵的加法(减法)即是指矩阵各元素之间的加法(减法)运算。矩阵必须具有相同的阶数时才可以进行加法(减法)运算。例三如下:矩阵及其运算由上例可以看出,矩阵m3为3*3的,而m1为4*4的。因而如果求m5=m3+m1,系统就会报错。(2)矩阵与矩阵的乘法在MATLAB7中,矩阵的乘法使用的是运算符“*”。由数学知识,我们知道们只有当第一个矩阵(左矩阵)的列数等于第二个矩阵(右矩阵)的行数时,两个矩阵的乘积才有意义。例四矩阵的乘法运算。矩阵及其运算由上例可以看出,矩阵A为4*4阶,矩阵D为3*3阶,两者的阶数不符合乘法的要求,因此报错。(3)矩阵与矩阵的除法在MATLAB7中,矩阵的除法有左除和右除两种,分别以符号“\”和“/”表示。但是从MATLAB6以来,矩阵的左除和右除的区别在逐渐减少。斜杆上面的数据除以斜杆下面的数据。三矩阵的特征参数运算关于矩阵的运算,主要包括:矩阵的特征值运算、行列式运算、矩阵的范数运算和矩阵的条件运算等。矩阵及其运算三矩阵的特征参数运算一矩阵的乘方运算和开方运算在MATLAB7中,可以使用Ap来计算A的p次方,使用函数sqrtm来对矩阵进行开方运算。如果有X*X=A,则有sqrtm(A)=X。例五求矩阵的乘方和开方运算。矩阵及其运算由此可见,矩阵的开方运算和乘方运算互为逆运算。二矩阵的指数和对数运算矩阵的指数运算用expm函数来实现;对数运算用logm函数来实现。两者互为逆运算。例六矩阵的指数和对数运算矩阵及其运算三矩阵的逆运算矩阵求逆在矩阵运算中,是非常重要的运算。矩阵可逆的充分必要条件就是矩阵的行列式不为零。在MATLAB中,所有复杂的问题都化为一个函数inv。例七求矩阵A的逆。四矩阵的行列式运算当矩阵的行和列相同时,可以进行矩阵的行列式操作。MATLAB提供了函数det来求行列式的值。例八求矩阵A的及其其逆矩阵B的行列式的值。矩阵及其运算五矩阵的特征值运算在矩阵中,特征值占据着重要的角色,在MATLAB中,可以利用eig、eigs两个函数来进行矩阵的特征值运算,其使用的格式和注意事项如下:E=eig(X)命令生成由矩阵X的特征值所组成的一个列向量。其中X必须是方阵。[V,D]=eig(X)命令生成两个矩阵V和D,其中V是以矩阵X的特征向量作为列向量组成的矩阵,D是由矩阵X的特征值作为主对角线元素构成的对角矩阵。矩阵及其运算eigs函数使用方法同eig函数相同,eigs函数使用的是迭代法来求解矩阵的特征值和特征向量。例九求矩阵A和X的特征值和特征向量。矩阵及其运算六矩阵的秩矩阵可以经过初等行或列变换,将其转换为行阶梯行矩阵,而行阶梯行矩阵所包含非零行的行数是一定的,这个确定的非零行的行数就是矩阵的秩。在MATLAB中,矩阵的秩可以通过函数rank来求得。七矩阵的迹矩阵的迹是指矩阵主对角线上所有元素的和,也是矩阵各特征值,矩阵的迹可以通过trace函数求得。矩阵及其运算四矩阵的分解运算MATLAB的数学处理能力之所以强大,很大一部分的原因就是它的矩阵函数功能的扩展。矩阵分解在数值分析和科学研究中有着重要的地位。常用的分解方法有以下几种:三角分解(lu)、正交分解(qr)、特征值分解(eig)和奇异值分解(svd)。我们这里主要介绍特征值分解。矩阵及其运算1、特征值分解由以前学过的知识,我们已经了解到在MATLAB是应用函数eig来解决的。但是应用到特征值分解的部分,需要在形式上作一定的变化,其使用的格式如下:[V,D]=eig(X)命令生成两个矩阵V和D,其中V是以矩阵X的特征向量作为列向量组成的矩阵,D是由矩阵X的特征值作为主对角线元素构成的对角矩阵,使得满足关系式X*V=V*D。矩阵及其运算[V,D]=eig(A,B)命令对矩阵A、B做广义特征值分解,使得满足关系式A*V=B*V*D。例十如下:矩阵及其运算五矩阵的一些特殊处理函数1矩阵的变维在MATLAB中,使用reshape函数对矩阵进行变维操作,其使用格式如下:reshape(X,M,N):该命令将矩阵X的所有元素分配到一个M×N的新矩阵,当矩阵X的元素不是M×N时,将返回一个错误。reshape(X,M,N,P,…):该命令返回由矩阵X的元素组成的M×N×P×…多维矩阵,如果M×N×P×…与X的元素数不同时,返回错误。矩阵及其运算reshape(X,[M,N,p,…]):该命令与上个reshape(X,M,N,p,…)命令的效果一致。例十一:矩阵及其运算2矩阵的变向矩阵的变向包括对矩阵进行旋转、上下翻转、左右翻转以及对指定的维进行翻转。分别由函数rot90、flipud、fliplr和flipdim来实现。具体用法如下:rot90(A):命令返回矩阵A按逆时钟方向旋转90度所得的矩阵。rot90(A,K):命令返回矩阵A按逆时针方向旋转90×K度所得的矩阵。(K=±1,±2,…)。flipud(X):命令将矩阵X上下翻转。矩阵及其运算filplr(X):该命令将矩阵X左右翻转。filpdim(X,DIM):还命令将矩阵X的第DIM维翻转。例十二矩阵及其运算六特殊矩阵的生成在介绍了矩阵的生成以后,在介绍一些特殊的矩阵的生成。1零矩阵和全1矩阵的生成零矩阵指的就是矩阵中的元素全部为零,在MATLAB中,使用zeros函数来生成一个零矩阵。它的使用格式如下:A=zeros(M,N)命令中,A为生成的零矩阵,M和N分别为生成矩阵的行和列。如果已经存在矩阵B,要生成与B维数相同的矩阵,矩阵及其运算可以使用命令:A=zeros(size(B))。当要生成一个方阵时,也可以直接使用命令A=zeros(N),此时MATLAB只是生成一个N阶方阵。而全1矩阵的生成与零矩阵的生成类似,只是使用函数ones来实现。例十三零矩阵和全1矩阵的生成。矩阵及其运算2对角矩阵的生成对角矩阵指的是对角线上的元素为任意数值,而其他元素为零的矩阵。在MATLAB中用函数diag来生成一个对角矩阵。其格式为:A=diag(V,K),该命令表示V为某个向量,K为向量V偏离主对角线的列数。K等于零时表示V为主对角线,K为大于零的数时表示V在主对角线以上,K小于零表示V在主对角线以下。矩阵及其运算A=diag(V),该命令的意义同A=diag(V,0)。即表示V为主对角线。例十四对角矩阵的生成函数。矩阵及其运算3随机矩阵的生成随机矩阵表示矩阵中的元素是随机数。在MATLAB中,使用两个函数rand和randn函数来生成多种随机矩阵。其使用格式如下:rand(N):表示生成N×N阶的随机矩阵,生成矩阵的元素值在区间(0.01.0)之间。rand(M,N):表示生成M×N阶随机矩阵,生成随机矩阵的元素值在区间(0.01.0)之间。randn(N):表示生成N×N阶的随机矩阵,生成的矩阵的元素值服从正态分布N(0,1)矩阵及其运算randn(M,N):表示生成M×N阶随机矩阵,生成的矩阵的元素值在服从正态分布N(0,1)。例十五随机矩阵的生成矩阵及其运算4魔术矩阵的生成魔术矩阵是一个经常遇到的矩阵,它是一个方阵,特点是每一行、每一列以及每一主对角线元素之和都同。在MATLAB中,用函数magic来生成。其格式如下:magic(N):表示生成N×N阶的魔术矩阵,使矩阵的每一行、每一列以及每一主对角线元素之和都同。其中N0,N=2除外。例十五魔术矩阵的生成。矩阵及其运算矩阵及其运算七稀疏型矩阵以上已经对MATLAB中的矩阵的用法做了一些基础的介绍,当创建一个矩阵的时候系统会为矩阵中的每一个元素分配内存。但是也存在如下的问题:例如函数A=eye(10)创建的矩阵有100个元素,其主对角线上的元素都为1,别的元素都为0。即10个元素是非零,其他的90个元素是0。所以矩阵要求有100个单元,而只有10个单元是非零的,这样的例子就是一个稀疏矩阵。矩阵及其运算上面的例子就是一个典型的稀疏矩阵。可见,无论对存储空间还是对零元素进行代数运算所需的计算量都是很大的浪费。对于这种情况,MATLAB提供了一个更为高级的存储方式,即稀疏矩阵方法,这个矩阵中,MATLAB7.0将不会存储矩阵中的0元素而只对非零元素进行操作。1稀疏矩阵的生成在MATLAB中,生成稀疏矩阵用以下几个函数:speye、spones、spdiags、find、full、spalloc、sprand和sprandn等,这里主要介绍几个常用的函数。矩阵及其运算1.speye函数Speye(size(A)):生成和单位矩阵A维数相同的单位稀疏矩阵。speye(M,N):生成单位稀疏矩阵,其中,其维数为M和N中较小的那个数。speye(M):生成M阶的单位稀疏矩阵。见例子矩阵及其运算2sprand函数该函数用于生成随机稀疏矩阵(其元素服从0-1分布)。R=sprand(S):产生与稀疏矩阵S结构相同的稀疏矩阵R,但是它的元素都是0到1上的随机数。R=sprand(M,N,D):产生一个M×N的随机稀疏矩阵R,它的非零元素的个数近似为M×N×D,注意D的值介于0和1之间。见例子矩阵及其运算2稀疏矩阵与满矩阵的相互转换在MATLAB中,用来将稀疏矩阵和满矩阵相互转换的函数有sparse、full和find。下面将具体介绍这三个函数的用法。1.sparse函数S=sparse(X):将满矩阵X转换为稀疏矩阵S。S=sparse(i,j,s,m,n,nzm):生成m×n的稀疏矩阵S,向量s的元素分布在以向量i的对应值和向量j的对应值为坐标的位置上。nzm为向量s的元素的个数。S=sparse(i,j,s,m,n):生成m×n的稀疏矩阵S,向量s的矩阵及其运算元素分布在以向量i的对应值和向量j的对应值为坐标的位置上,其中,nzmax=length(s)。S=sparse(i,j,s):生成m×n的稀疏矩阵S,向量s的元素分布在以向量i的对应值和向量j的对应值为坐标的位置上,其中m=max(i),n=max(j)。S=sparse(m,n):即是sparse([],[],[],m,n,0)的简化形式。见例题:矩阵及其运算2.full函数在MATLAB7.0中,可以利用full函数将稀疏函数转化为满矩阵。下面将介绍函数的用法:S=full(X):将稀疏矩阵X转化为满矩阵S。如果X的本身是满矩阵,系统将不做任何操作。见例子24矩阵及其运算3。find函数I=find(X):返回矩阵X的非零元素的位置。例如:I=find(X100)返回X中大于100的元素的位置。[I,J]=find(X):返回矩阵X中非零元素所在的行(I)和列(J)的具体数据。这种用法通常由于稀疏矩阵。[I,J,V]=find(X):除了返回I和J以为还返回一个向量,这个向量的数值为矩阵中非零元素数值。矩阵及其运算3稀疏矩阵的操作对稀疏矩阵进行操作,主要由nnz、nonzeros、nzma