![MATLAB/Simulink权威指南:开发环境、程序设计、系统仿真与案例实战](https://wfqqreader-1252317822.image.myqcloud.com/cover/629/27111629/b_27111629.jpg)
2.4 矩阵分析
矩阵是MATLAB语言的基本运算单元。本节主要介绍矩阵分析与处理的常用函数和功能。
2.4.1 方阵的行列式
一个行数和列数相同的方矩阵可以看作一个行列式,而行列式是一个数值。MATLAB语言用D=det(A)函数求方矩阵的行列式的值。例如:
已知一个方矩阵A=[1 0 1;2 1 0;0 2 1],求行列式的值D。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P71_28758.jpg?sign=1739671003-nDAAPZtoJF69RULSDoTEeg9Np8eRF3fU-0-701f602ddd5e46b3ccd1321e15a3f485)
2.4.2 矩阵的秩和迹
1.矩阵的秩
与矩阵线性无关的行数或者列数称为矩阵的秩。MATLAB语言用r=rank(A)函数求矩阵的秩。例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P72_28760.jpg?sign=1739671003-AByFnZk1poV2VdMb96e6LuHAReb7Va96-0-5ca5a6ca2db35469475d74fc8d74f7ae)
2.矩阵的迹
一个矩阵的迹等于矩阵的对角线元素之和,也等于矩阵的特征值之和。MATLAB语言用t=trace(A)函数求矩阵的迹。例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P72_28761.jpg?sign=1739671003-nMLPy80ZYCEBO2zLRLwpJrHAUCsOuPwt-0-1f69abe51e0bbc1f7463bd21731f819a)
2.4.3 矩阵的逆和伪逆
1.方阵的逆矩阵
对于一个方矩阵A,如果存在一个同阶方矩阵B,使得A·B=B·A=I(其中I为单位矩阵),则称B为A的逆矩阵,A也为B的逆矩阵。
在线性代数里用公式计算逆矩阵相对烦琐,然而,在MATLAB语言里,用求逆矩阵的函数inv(A)求解却很容易。例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P72_28762.jpg?sign=1739671003-9hDgyV9pUS5HMQWGNzmoPfhZaLSr0YgC-0-456c740444ee3ab3ebfd3e3d043e6df9)
显然,A∗B=B∗A=I,故B与A是互逆矩阵。
2.矩阵的伪逆矩阵
如果矩阵A不是一个方阵,或者A为非满秩矩阵,那么就不存在逆矩阵,但可以求广义上的逆矩阵B,称为伪逆矩阵,MATLAB语言用B=pinv(A)函数求伪逆矩阵。例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P73_28764.jpg?sign=1739671003-G4UqZXcpItYm9VSSsBS9gmKohiFNl0Bz-0-64c3f8dbb4c8fbba6b9fb190c2f8b664)
在线性代数中,可以用矩阵求逆的方法求解线性方程组的解。将设有n个未知数,由n个方程构成线性方程组,表示为
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P73_28766.jpg?sign=1739671003-2MLbAOIjFaA18BkvOJLBZgvumImQNVNz-0-ffd0128efc91f872335382d76a03dd7b)
用矩阵表示为
Ax=b
其中:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P74_28769.jpg?sign=1739671003-xOUDrq1Rw4q2IDE9pMGgOjPqQgI1cBQn-0-635a3a175ec0162d96d1dab29a834721)
线性方程组的解为
x=A﹣1b
所以,利用MATLAB求系数矩阵A的逆矩阵,可以求线性方程组的解。
【例2-3】 利用MATLAB求系数矩阵的逆矩阵方法,求如下线性方程组的解。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P74_28771.jpg?sign=1739671003-dza7vpdtWLp27LYXeXH8nLxD3iQ1r1j3-0-28fb652eeb138a953cff393c4418e13c)
MATLAB命令程序如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P74_28773.jpg?sign=1739671003-EhZo1hCovavaHscIBA6o7ukO3Cwl6rLC-0-34cda2804b7db5cf3ff821af20a276c1)
2.4.4 矩阵的特征值和特征向量
矩阵的特征值与特征向量在科学计算中广泛应用。设A为n阶方阵,使得等式Av=Dv成立,则D称为A的特征值,向量v称为A的特征向量。MATLAB语言用函数eig(A)求矩阵的特征值和特征向量,常用下面两种格式:
(1)E=eig(A)求矩阵A的特征值,构成向量E;
(2)[v,D]=eig(A)求矩阵A的特征值,构成对角矩阵,并求A的特征向量v。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P74_28774.jpg?sign=1739671003-cq75JDFDLID64Z3YnWZlIspOIPM260jE-0-14693b835c74953757fd0b5132247e35)
显然,A∗v=v∗D,故D和v分别是A矩阵的特征值和特征向量。
特征值还可以应用于求解一元多次方程的根,具体方法是,先将方程的多项式系数组成行向量a,然后用compan(a)函数构造成伴随矩阵A,最后再用eig(A)函数求A的特征值,特征值就是方程的根。
【例2-4】 用MATLAB求特征值的方法求解一元多次方程的根,方程如下:
x5﹣5x4+5x3+5x2﹣6x=0
MATLAB命令程序如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P75_28779.jpg?sign=1739671003-IWRaTizEnpwA15MpRIWEpsChsiVLTf3y-0-736ecea1a4b32f51a07b094d498c8da9)
当然,求一元多次方程的根还可以利用多项式函数roots。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P75_28780.jpg?sign=1739671003-EsTX5tSoVxtRA6MCirSUQ72oFD7s5rEa-0-f33f7eed8c2cb81ff918f15bce0bfc16)
显然,用这两种不同方法求解一元多次方程的根,结果是一样的。
2.4.5 矩阵的分解
矩阵有多种分解方法,常见的有对称正定矩阵分解(Cholesky)、高斯消去法分解(LU)、正交分解(QR)和矩阵的奇异值分解(SVD)。
1.对称正定矩阵分解
MATLAB语言中的对称正定矩阵Cholesky分解用函数chol(A),函数语法格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P76_28781.jpg?sign=1739671003-an5JXo8LlYg7Xyvtm3fbEIkCHkNhE7CW-0-52ba431c54501937c7f41e7b1d9abf32)
其中,分解后的R满足R′∗R=A。若A是n阶对称正定矩阵,则R为实数的非奇异上三角矩阵;若A是非正定矩阵,则产生错误信息。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P76_28782.jpg?sign=1739671003-mg9LZdnB9jS8AGVALDrnYIOfzE1AFt5V-0-e17cea5f716546a75de7bd85ad9dcf9a)
其中,分解后的R满足R′∗R=A。若A是n阶对称正定矩阵,则R为实数的非奇异上三角矩阵,p=0;若A是非正定矩阵,则p为正整数。
例如,已知A=[1 1 1;1 2 3;1 3 6],求该矩阵的Cholesky分解。
MATLAB语言程序代码及结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P76_28784.jpg?sign=1739671003-FFftI461S0xg7lQtqpuIvaXjgULqp6bB-0-dea93a7cf9cd7a2cc554480c2ee01901)
由结果可知,Cholesky分解得到的R矩阵是一个实数的非奇异上三角矩阵,且满足R′∗R=A。
当A为非正定矩阵时,用Cholesky分解,错误信息如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P76_28785.jpg?sign=1739671003-5I7o1hAmTZVhFhBpyZq5BkMVtZzCJk6G-0-bfb9573cdfed2b7147f313c9acf499d1)
2.矩阵的高斯消去法分解
高斯消去法分解是在线性代数中矩阵分解的一种重要方法,主要应用在数值分析中,用来解线性方程及计算行列式。矩阵的高斯消去法分解又称为三角分解,是将一个一般方矩阵分解成一个下三角矩阵L和一个上三角矩阵U,且满足A=LU,故称为LU分解。MATLAB语言用lu(A)函数实现LU分解。函数语法格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P77_28786.jpg?sign=1739671003-M5FvpBQCyJUFEnPvSxC3SBO802jhWr71-0-0ada607fa963c8a7d7a1ad949566978b)
其中,L为下三角矩阵或其变换形式,U为上三角矩阵,且满足LU=A。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P77_28787.jpg?sign=1739671003-2Ca5ossXCHsGEr2TMhqolvJoyypzAMQm-0-1905370cf257e7bdee42e0203059baba)
其中,L为下三角矩阵,U为上三角矩阵,P为单位矩阵的行变换矩阵,且满足LU=PA。
例如,已知A=[1 2 3;4 5 6;7 8 9],求该矩阵的LU分解。
MATLAB语言程序代码及结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P77_28789.jpg?sign=1739671003-0mOFSmHbjQd5vjzHQ1lg1MWYHclYmQRf-0-244d478062183473cc7ca49bfbaef79d)
由上述结果可知,LU分解得到的L是一个下三角变换矩阵,U是一个上三角矩阵,且满足L∗U=A。
同样的矩阵A,若用另一种LU分解,结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P77_28790.jpg?sign=1739671003-6fbRBHlhEtUiRVHs9MW6xnhTqc4fkj3d-0-f9e2f25e2dfc0cd8eb76d4fd5ff8ff5e)
由上述结果可知,LU分解得到的L是一个下三角矩阵,U是一个上三角矩阵,P为单位矩阵的行变换矩阵,且满足L∗U=P∗A。
3.矩阵的正交分解
矩阵的正交分解是将一个一般矩阵A分解成一个正交矩阵Q和一个上三角矩阵R的乘积,且满足A=QR,故称为QR分解。
MATLAB语言用qr(A)函数实现QR分解。函数语法格式如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P78_28792.jpg?sign=1739671003-LwSwNietOHcHuyZHffNBug0Limnxxen3-0-575cadb27c7b1f4e6b752154b61218f5)
其中,Q为正交矩阵,R为上三角矩阵,且满足QR=A。
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P78_28793.jpg?sign=1739671003-OCVNkObn8qoA2pzpF0OOryYxUue12sPF-0-6aee83e6da77368889ef429d931583bb)
其中,Q为正交矩阵,R为对角元素按大小降序排列的上三角矩阵,E为单位矩阵的变换形式,且满足QR=AE。
例如,已知A=[1 2 3;4 5 6;7 8 9],求该矩阵的QR分解。
MATLAB语言程序代码及结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P78_28795.jpg?sign=1739671003-POlRFH11dazYb9JUpwN0E6UJVfB1KqG4-0-395f13ba07d2e1014b7ff22b6583ac28)
由上述结果可知,QR分解得到的Q是一个正交矩阵,R是一个上三角矩阵,且满足Q∗R=A。
同样的矩阵A,若用另一种QR分解,结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P79_28797.jpg?sign=1739671003-KIBKWLujEZQ2DrpJxPn23WdNhEL7kRH2-0-72945426caee4035edf2a6ff54625a6f)
由上述结果可知,QR分解得到的Q为正交矩阵,R为对角元素按大小降序排列的上三角矩阵,E为单位矩阵的变换形式,且满足Q∗R=A∗E。
4.矩阵的奇异值分解
奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解方法,可以应用在信号处理和统计学等领域。矩阵的奇异值分解是将一个一般矩阵A分解成一个与A同大小的对角矩阵S,两个酉矩阵U和V,且满足A=U∗S∗V'。
MATLAB语言用svd(A)函数实现奇异值分解。函数语法格式如下:
s=svd(A)产生矩阵A的奇异值向量。
[U,S,V]=svd(A)产生一个与A同大小的对角矩阵S、两个酉矩阵U和V,且满足A=U∗S∗V'。若A为m×n阵,则U为m×m阵,V为n×n阵。奇异值在S的对角线上,非负且按降序排列。
例如,已知A=[1 2 3;4 5 6],求该矩阵的奇异值分解。
MATLAB语言程序代码及结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P80_28798.jpg?sign=1739671003-xknRsmQhDPs9DLHZ3XsLRnkmnAwTQeb5-0-c4863fc0add922b8d8561151d911d90b)
由上述结果可知,奇异值分解得到的一个与A同大小的对角矩阵S、两个酉矩阵U和V,且满足A=U∗S∗V'。
2.4.6 矩阵的信息获取函数
MATLAB语言提供了很多函数以获取矩阵的各种属性信息,包括矩阵的大小、矩阵的长度和矩阵元素的个数等。
1.size
MATLAB语言可以用size(A)函数来获取矩阵A的行和列的数。函数的调用格式如下:
D=size(A)返回一个行和列数构成两个元素的行向量;
[M,N]=size(A)返回矩阵A的行数为M,列数为N。
例如,已知A=[1 2 3;4 5 6],求该矩阵的行数和列数。
MATLAB语言程序代码及结果如下:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P80_28799.jpg?sign=1739671003-6pmNGv8PoCYvDuLAr2QHmc5rrytUTlBL-0-83a0ee7ab9d5edd4f871c97737c97f14)
2.length
MATLAB语言可以用length(A)函数来获取矩阵A的行数和列数的较大者,即length(A)=max(size(A))。函数的调用格式如下:
d=length(A)返回矩阵A的行数和列数的较大者。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P81_28800.jpg?sign=1739671003-c5bGd4VZGadD2lXG2gQJjKUEcyZ2tLsv-0-deb5173210ffa6a5a6332ffd11bfc70e)
3.numel
MATLAB语言可以用numel(A)函数来获取矩阵A的元素的总个数。函数的调用格式如下:
n=numel(A)返回矩阵A的元素的总个数。
例如:
![](https://epubservercos.yuewen.com/59B7C6/15477655505633306/epubprivate/OEBPS/Images/Figure-P81_28801.jpg?sign=1739671003-fhgNa5Di1nhu3lKg0l5vb0LhtvT4gdAE-0-4e708d90b3742dc428d069ee98e39f85)