第7章矩阵分析MATLAB为工程技术人员、科研工作者提供了方便、强大的数值计算功能,这也是MATLAB得以流行的重要因素。用户在利用MATLAB解决实际问题时,首先将该问题转化为数学问题,然后将相应的数学求解过程翻译为MATLAB程序代码。同其他计算机语言(如C、C++、Java等)不同的是,MATLAB语言是一种边解释边执行的程序语言,其风格更像是一种数学语言。因此用户利用MATLAB解决问题并不需要了解很多编程方面的知识,而只需懂得基本的MATLAB语法。另外,MATLAB内置了大量的数值计算函数,这些函数封装了常用的数值计算功能。利用这些数值计算函数,用户能够从烦琐的编程工作中解放出来,集中精力解决问题。本书将MATLAB数值计算分为四章分别讨论,本章及下面的两章(8、9)分别介绍矩阵分析、函数分析和数据分析等初等数值计算内容,第10章将讨论数值计算的一些高级话题。本章的矩阵分析主要讨论以下问题:矩阵基本运算,如加、减、乘、除四则运算等;矩阵特征量,如行列式、条件数、范数、秩等;矩阵分解;矩阵函数;稀疏矩阵。7.1MATLAB数值计算中的矩阵矩阵分析无论是在数学理论还是实际工程问题中都具有重要的应用,例如,线性方程组的解与矩阵除法、矩阵的特征量(如行列式、逆、条件数、秩等)、矩阵分解相关;二次型(,为特征矩阵)的最大(小)值为对应特征矩阵的最大(小)特征值;线性系统的稳定性与系统特征矩阵的谱半径有关。MATLAB的最初雏形是为了解决大规模矩阵运算而编写的一系列函数模块。矩阵作为MATLAB的基本数据结构,一直是MATLAB的核心,是MATLAB基本的运算单元,其大部分的内建函数也都支持矩阵作为输入变量,用户在编写自用程序时也应当尽量遵循这一约定。7.1.1MATLAB中的矩阵前面的章节已对MATLAB中矩阵的概念、创建、操作等进行了详细的介绍,矩阵作为MATLAB数据组织、运算的基本单元,为MATLAB带来了众多的优势:高效,利用矩阵封装多重循环运算,通过其内置的程序优化提高代码运行效率;简洁,矩阵对多重循环的封装使代码更加简洁、方便;安全,矩阵运算内置了相关的出错处理,代码更加安全,同时除错也更加方便。另外,MATLAB的大部分内建函数都支持矩阵作为输入变量,相应地以矩阵作为输出变量,这使得程序结构更加清晰,代码编写也更加简便。7.1.2求解线性代数方程信号处理、自动控制等工程领域的众多问题可以归结为下面的数学问题:已知,则有,称为系数矩阵,为值向量,为解向量。令,为扩展系数矩阵,的解与的秩、的行列式、逆、条件数等有关,这些内容将在下面的各节中详细展开。1111221111121211222222122212112212,,,,。NNNNNNNMMMNNMMMMNaxaxaxbaaaaxaxaxbaaaxxxAaxaxaabaaa求令1122,NNxbxbxbxb7.1.3最大(小)值考虑信号估计理论中的一个经典问题:在(恒量)的条件下,求向量使最大,其中为实对称矩阵。可以证明,当为最大特征值对应的特征向量时,达到最大值,为的最大特征值;相反,当为最小特征值对应的特征向量时,达到最小值,为的最小特征值。实际上,矩阵的特征值和特征向量在许多工程应用中都具有很重要的应用,例如线性系统的稳定性取决于系统特征矩阵的谱半径等。7.2矩阵基本运算矩阵是MATLAB数据组织和运算的基本单元,矩阵的加、减、乘、除四则运算、幂运算、比较运算和逻辑运算等代数运算是MATLAB数值计算最基础的部分。这里可以粗略地将矩阵运算分为两类,即普通数值运算(四则运算、幂运算)和关系运算(比较运算、逻辑运算),最后本节特别介绍了矩阵的按位运算。为了描述的方便,这里对本节所涉及相关数学符号稍作统一,矩阵用大写字母表示,如、、;矩阵的第行、第列元素用带下标的小写字母表示,如、、;表示的转置矩阵;表示的Hermite转置;为方阵的行列式;为方阵的逆矩阵;为方阵的范数。7.2.1矩阵的加、减矩阵的加、减运算定义为相应元素的加减。对矩阵、,其和(差),C也为矩阵,且。矩阵的加、减运算要求参与运算的矩阵具有相同的大小,或者其中之一为标量,例如矩阵A与标量的和(差),为矩阵,且。CABMNmnmnmncabMNxCAxCMNmnmncax7.2.2矩阵乘法7.2.3矩阵除法矩阵除法是乘法的逆运算,MATLAB也定义了两类矩阵除法。第一类是矩阵的线性代数除法,对应于矩阵线性代数乘法的逆运算。矩阵线性代数除法又有两种算子,即右除算子和左除算子,如表所示。ABC/ACBABC\BAC矩阵线性代数除法,则,则运算符名称说明/右除\左除7.2.4矩阵的幂矩阵的幂与矩阵乘法具有紧密的联系,MATLAB也定义了两类矩阵幂运算。第一类与矩阵线性代数乘法相对应,由表示,其中为阶方阵,。^CAnnCAAA7.2.5矩阵按位运算按位运算是MATLAB为矩阵设计的一种简洁、高效、安全的运算模式,实际上是对多重循环的高效封装,从而提高代码执行的高效和安全程度。前面介绍的矩阵加减、按位乘除、按位幂都是按位运算符。按位运算符一般有一个(.)作为前导符,.*./.\.矩阵的按位运算符+加-减按位乘按位右除按位左除按位幂7.2.6关系运算注意到例7.10中的向量化代码(Mean=mean(V(V=1))),该段代码涉及三种按位运算:比较运算、逻辑运算和逻辑下标。这三种运算为代码向量化提供了强大的引擎。表列出了MATLAB支持的比较运算符和逻辑运算符。比较运算算子符号说明大于小于=不小于=不大于==等于~=不等于7.3矩阵特征量线性代数中有一些矩阵特征量用于刻画矩阵某方面的性质,如行列式、范数、条件数、秩等。这里从求解7.1.2给出的线性方程组出发讨论矩阵相关的特征量,包括矩阵的行列式、秩、范数、条件数、范数以及矩阵的逆。7.3.1矩阵的行列式关于矩阵行列式的概念,这里不作赘述,如有疑问,请参考任何一本线性代数方面的书籍。如阶矩阵的行列式不等于0,即时,称矩阵非奇异,否则奇异。如果限定线性方程组的系数矩阵为方阵,当非奇异,则线性方程有惟一解。对N阶方阵,MATLAB调用函数得到矩阵行列式,下面是求阶方阵行列式的例子。7.3.2矩阵的逆若系数矩阵非奇异,即,则线性方程组有惟一解,该惟一解为,其中为的逆矩阵。对非奇异矩阵,其逆矩阵是满足以下条件的矩阵:(I为单位矩阵)。MATLAB调用函数inv(A)求的逆矩阵,以下是逆矩阵应用的一些例子,这些例子也验证了前面给出的关于逆矩阵的性质。7.3.3矩阵的范数如果将矩阵看作一个线性变换系统,则矩阵范数从整体上描述了系统的放大作用,矩阵范数的定义如下:。其中为列向量,为向量的范数。对矩阵,常用的范数有以下几种。1-范数,,也称为列和范数。2-范数,,为A的奇异值。范数,,也称为行和范数。F-范数,。MATLAB利用函数norm计算范数,函数norm的调用格式为:norm(A,opt)7.3.4矩阵的条件数7.3.2小节中提到,当线性方程组系数矩阵非奇异时,线性方程有唯一惟一解,且该解为。那么一个很容易想到的问题就是:当系数矩阵接近奇异时,例如很小,利用求解线性方程组会有什么样的问题?这里暂且撇开上面提出的问题,而首先考虑以下问题:即如何衡量是大还是小的问题。对这一问题,显然需要确定一个参考数量以确定是大还是小,这一参考数量称为矩阵的范数,用表示。当成立时,则认为小,矩阵是奇异的。7.3.5矩阵的秩对7.1.2节给出的线性方程组求解问题。根据、的不同取值,线性方程组可以分为以下三类:,为超定方程;,为恰定方程;,为欠定方程。MNMNMN7.4矩阵分解矩阵分解是矩阵理论的重要内容,在信号处理、自动控制等众多领域中有着非常广泛的应用。矩阵分解通过将复杂矩阵表示成形式简单或具有良好数学性质(统称为简单矩阵)的组合,以便于理论分析或数值计算。通常矩阵分解将复杂矩阵分解为几个简单矩阵的乘积。在很多ǖ烫岢隽烁髦志卣蠓纸夥椒ǎEVD)、Schur分解、Cholesky分解、LU分解、QR分解、SVD分解等,7.4.1特征分解7.4.2Schur分解7.4.3Cholesky分解对任意正定矩阵的Cholesky分解(柯利分解)。Cholesky分解在理论分析、数值计算等方面有重要应用。MATLAB提供函数chol和cholinc用于正定矩阵的Cholesky分解。Chol常用的调用格式有以下两种:R=chol(X)[R,p]=chol(X)如果X为正定矩阵,则返回上三角矩阵R,此时p=0,表示函数调用成功;如果X非正定,则前一种调用会产生错误信息,后一种调用不会产生错误,而是将p设为正整数,用户可以通过查询p的状态检查Cholesky分解是否成功,也可以依此判断X的正定性。7.4.4LU分解7.4.5QR分解7.4.6SVD分解7.5矩阵函数矩阵函数是矩阵理论的重要概念,在信号处理、系统控制等领域有着重要的应用。如果将矩阵看作一个线性系统,那么矩阵函数可以看作系统的级联、合成。利用矩阵函数的概念可以得到很多工程应用中有用的工具。7.5.1矩阵函数的概念7.5.2常用矩阵函数7.5.3自定义矩阵函数用户除了可以使用MATLAB内建的矩阵函数之外,还可以利用MATLAB提供的funm函数,创建自定义的矩阵函数。funm函数以矩阵和自定义函数句柄作为输入参数,其一般调用格式为:F=funm(A,fun)F=funm(A,fun,options)[F,exitflag]=funm(...)其中fun为函数句柄;option用于计算过程的控制、结果显示等,这里不做具体介绍;exitflag保存了函数结束的信息,若exitflag=0,则函数计算成功;若exitflag=1,则表明计算过程不收敛,但结果也有可能是正确的。7.6稀疏矩阵实际工程中的数据处理任务面临大容量数据的挑战,当涉及大型矩阵的数值计算时,一个重要的问题是存储和执行效率的问题。稀疏矩阵的概念,正是为了解决这一问题而提出的。从数学性质上看,稀疏矩阵与一般的矩阵没有差别,但在数据存储和执行算法上有着很大的不同。本节在讲述稀疏矩阵时,经常与全矩阵作对比,使读者对稀疏矩阵的概念和使用方法有一个更加透彻的理解。本节将一般的矩阵称为全矩阵(FullMatrix),以区别于稀疏矩阵。7.6.1稀疏矩阵与全矩阵稀疏矩阵是这样一类矩阵,其元素仅有少数不为0,而大量的元素为0。稀疏矩阵的这种性质使得MATLAB可以对其采用不同于全矩阵的存储方式和执行算法以提高效率。MATLAB利用二维数组存储全矩阵,对零元、非零元不作区分,统一采用浮点数;但在存储稀疏矩阵时只存储非零元及其对应的索引值(整型)。显然,这种存储方式能够大大提高稀疏矩阵的存储效率,看下面的例子。7.6.2创建稀疏矩阵除了通过将全矩阵转换为稀疏矩阵外,MATLAB还提供了一系列函数用于创建稀疏矩阵,如表所示。稀疏矩阵创建函数函数名说明sparse生成一般的稀疏矩阵speye生成单位稀疏矩阵sprand生成均匀分布随机稀疏矩阵sprandn生成正态分布随机稀疏矩阵sprandsym生成对称随机稀疏矩阵spdiags生成对角稀疏矩阵7.6.3稀疏矩阵操作一般地,能用于全矩阵的操作函数对稀疏矩阵同样有效,并且具有相似的操作规则,现总结如下:下标寻访赋值函数;用于矩阵拼接的函数,如cat,horzcat、vertcat、repmat,若输入参数中有一个为稀疏矩阵,则返回结果为稀疏矩阵;矩阵变形函数,如ctranspose、flipdim、fliplr、flipud、reshape、rot90、transpose,这些函数都是单输入函数,若输入为稀疏矩阵,则返回结果也为稀疏矩阵;