6.4 矩阵运算
本节将介绍MATLAB中与矩阵运算相关的内容,包括矩阵分析、矩阵分解、特征值和特征向量求解等。
6.4.1 矩阵分析
MATLAB提供的矩阵分析函数(常见函数)如表6.2所示。
表6.2 矩阵分析函数
有关的数学知识可参考相关的线性代数书籍,这里不再赘述。下面简单介绍这些函数的使用方法。
1.向量和矩阵的范数运算
MATLAB提供norm函数来求向量和矩阵的范数。该函数求解向量的范数的调用格式如下:
N=norm(x, p):对任意大于等于1的p值,返回向量x的p阶范数; N=norm(x, inf):返回向量的正无限阶范数,相当于N=max(abs(x)); N=norm(x, -inf):返回向量的负无限阶阶范数,相当于N=min(abs(x))。
求矩阵范数调用格式如下:
N=norm(A):计算矩阵的2 阶范数,也就是最大奇异值; N=norm(A, p):根据参数p的值不同,求不同阶的范数值——
● 当p=1时,计算矩阵A的1阶范数,相当于max(sum(abs(A)));
● 当p=2时,计算矩阵A的2阶范数,相当于norm(A);
● 当p=inf时,计算矩阵A的正无限阶范数,相当于max(sum(abs(A')))。
● 当p= 'fro’时,计算矩阵A的F范数(Frobenius范数)。
另外,函数normest可以估计矩阵的二阶范数,该函数的调用格式如下:
normest(S):估计矩阵S的2阶范数值,默认允许的相对误差为1e-6; normest(S, tol):使用tol作为允许的相对误差,估计矩阵S的2阶范数值。
例6-33,求向量范数示例。
在命令行窗口输入:
N2=norm(1:6,2) Np=norm(1:6, inf) Nn=norm(1:6, -inf)
输出结果如下:
N2 = 9.5394 Np = 6 Nn = 1
例6-34,求矩阵的范式示例。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; N1=norm(A,1) %矩阵的1阶范式 N2=norm(A) %矩阵的2阶范式 Np=norm(A, inf) %矩阵的无穷范式 Nf=norm(A, 'fro') %矩阵的F范式 Ne2=normest(A) %矩阵的2阶范式的估计值
输出结果如下:
N1 = 17 N2 = 16.0216 Np = 24 Nf = 16.0624 Ne2 = 16.0216
2.矩阵的秩
矩阵中线性无关的列向量个数称为列秩,线性无关的行向量个数称为行秩。MATLAB提供函数rank来计算矩阵的秩,该函数调用格式如下:
rank(A):用默认允许误差计算矩阵的秩; rank(A, tol):在给定允许误差内计算矩阵的秩。
例6-35,求矩阵的秩示例。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; B=eye(3); r1=rank(A) %矩阵的秩 r2=rank(B) %矩阵的秩
输出结果如下:
r1 = 2 r2 = 3
提示
结果说明,矩阵B为满秩矩阵,矩阵A不是满秩矩阵。
3.矩阵的行列式
MATLAB提供函数det来计算矩阵的行列式。该函数的调用格式为d = det(X)。
例6-36,求矩阵的行列式示例。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; B=eye(3); r1=det(A) %矩阵的行列式 r2=det(B) %矩阵的行列式
输出结果如下:
r1 = 0 r2 = 1
4.矩阵的迹
MATLAB提供函数trace来计算矩阵的迹。该函数的调用格式为b = trace(A)。
例6-37,求矩阵的迹示例。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; B=eye(3); t1=trace(A) %矩阵的迹 t2=trace(B) %矩阵的迹
输出结果如下:
t1 = 14 t2 = 3
5.矩阵的化零矩阵
MATLAB提供函数null来计算矩阵的化零矩阵。该函数的调用格式为:
Z = null(A):返回矩阵A的一个化零矩阵,如果化零矩阵不存在则返回空矩阵; Z = null(A, 'r'):返回矩阵A的有理数形式的化零矩阵。
例6-38,求矩阵的化零矩阵。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; Z=null(A) %求矩阵A的有理数形式的零矩阵 AZ=A*Z %验证化零矩阵 ZR=null(A, 'r') %求矩阵A的有理数形式的化零矩阵 P=A*ZR %验证化零矩阵
输出结果如下:
Z = 0.4082 -0.8165 0.4082 AZ = -0.2220*1.0e-15 0 0 ZR = 1 -2 1 P = 0 0 0
6.矩阵的正交空间
MATLAB提供函数null来求解矩阵的正交空间。该函数的调用格式为B = orth(A)。
例6-39,求矩阵的正交空间示例。
在命令行窗口输入:
A=[1 2 3;3 4 5;7 8 9]; Q=orth(A)
输出结果如下:
Q = -0.2262 -0.8143 -0.4404 -0.4040 -0.8688 0.4168
7.矩阵空间夹角
MATLAB提供函数subspace来求解矩阵的正交空间。该函数的调用格式为theta=subspace(A, B),返回矩阵A和矩阵B之间的夹角。
例6-40,求矩阵A和B之间的夹角示例。
在命令行窗口输入:
A=[0 0 3;3 4 5;7 8 9]; B=magic(3); theta=subspace(A, B)
输出结果如下:
theta = 9.3770e-16
6.4.2 矩阵分解
矩阵分解是把一个复杂矩阵分解成几个结构简明的矩阵的乘积。本小节将介绍几种矩阵分解的方法,相关函数如表6.3所示。
表6.3 矩阵分解函数
除表中列出的分解方式外,还有更多不常用的分解方式,本书不作介绍,请读者参考有关书籍和帮助文件。
1.对称正定矩阵的Cholesky分解
Cholesky分解在MATLAB中用函数chol来实现,其常用的调用方式如下:
R = chol(A) L = chol(A, 'lower') [R, p] = chol(A) [L, p] = chol(A, 'lower') [R, p, s] = chol(A) [R, p, s] = chol(A, 'vector') [L, p, s] = chol(A, 'lower', 'vector')
其中,A为对称正定矩阵,若为非正定矩阵则函数返回出错信息;R是上三角矩阵,满足R'*R=A; L是下三角矩阵,满足L*L'=A; p为上三角矩阵的阶数,满足A(1:p-1,1:p-1)=R'*R。
例6-41, Cholesky矩阵分解示例。
在命令行窗口输入:
A=pascal(5) %产生5阶帕斯卡矩阵 B=A-1 C=chol(A) %获取上三角分解矩阵 J1=isequal(C'*C, A) %验证 L = chol(A, 'lower') %获取上三角分解矩阵 J2=isequal(L*L', A) %验证 CB=chol(B) %分解非正定矩阵
输出结果如下:
A = 1 1 1 1 1 1 2 3 4 5 1 3 6 10 15 1 4 10 20 35 1 5 15 35 70 B = 0 0 0 0 0 0 1 2 3 4 0 2 5 9 14 0 3 9 19 34 0 4 14 34 69 C = 1 1 1 1 1 0 1 2 3 4 0 0 1 3 6 0 0 0 1 4 0 0 0 0 1 J1 = 1 L = 1 0 0 0 0 1 1 0 0 0 1 2 1 0 0 1 3 3 1 0 1 4 6 4 1 J2 = 1 Error using chol Matrix must be positive definite.
2.LU分解
LU分解可以将任意一个方阵A分解为一个下三角矩阵L和一个上三角矩阵U的乘积,即A=LU。LU分解在MATLAB中用函数lu来实现,其调用格式如下:
Y = lu(A) [L, U] = lu(A) [L, U, P] = lu(A)
其中,A为方阵,L为下三角矩阵,U为上三角矩阵,满足关系X=L*U, P为置换矩阵,满足关系P*A = L*U, Y把上三角矩阵和下三角矩阵合并在矩阵中给出,满足Y=L+U-I。
提示
可以利用LU分解来计算矩阵的行列式的值和矩阵的逆,其命令形式如下:
det(A)=det(L)*det(U)
inv(A)=inv(U)*inv(L)
例6-42, LU分解示例。
在命令行窗口输入:
A = [ 3 2 4; 9 5 6; 1 8 0 ]; [L1, U1]=lu(A) %矩阵的LU分解 J1=isequal(L1*U1, A) %验证 [L2, U2, P]=lu(A) J2=isequal(L2*U2, P*A) %验证 Y=lu(A) J3=isequal(Y, L2+U2-eye(size(A))) %验证
输出结果如下:
L1 = 0.3333 0.0448 1.0000 1.0000 0 0 0.1111 1.0000 0 U1 = 9.0000 5.0000 6.0000 0 7.4444 -0.6667 0 0 2.0299 J1 = 1 L2 =1.0000 0 0 0.1111 1.0000 0 0.3333 0.0448 1.0000 U2 = 9.0000 5.0000 6.0000 0 7.4444 -0.6667 0 0 2.0299 P = 0 1 0 0 0 1 1 0 0 J2 = 1 Y = 9.0000 5.0000 6.0000 0.1111 7.4444 -0.6667 0.3333 0.0448 2.0299 J3 = 1
3.正交分解
正交分解又称QR分解。QR分解把一个m×n的矩阵A分解为一个正交矩阵Q和一个上三角矩阵R的乘积,即A=Q*R。在MATLAB中QR分解由函数qr来实现,其调用格式如下:
R = qr(A) R = qr(A,0) [Q, R] = qr(A) [Q, R] = qr(A,0) [Q, R, E] = qr(A) [Q, R, e] = qr(A,0) [C, R] = qr(A, B) [C, R, E] = qr(A, B)
其中,A为待分解矩阵;Q为正交矩阵;R为上三角矩阵;参数0代表则只计算矩阵Q的前n列元素,得到的R为n×n的矩阵;E为置换矩阵,满足A*E=Q*R;矩阵B与矩阵A具有相同的行数。
例6-43, QR分解示例。
在命令行窗口输入:
A = [ 3 2 4; 9 5 6; 1 8 0 ]; R1 = qr(A) [Q2, R2]=qr(A) B=[1 3 5 6;8 2 7 3;1 3 5 9]; [Q3, R3, E3] = qr(B)
输出结果如下:
R1 = -9.5394 -6.1849 -6.9187 0.7177 7.3991 -0.6475 0.0797 -0.8880 -1.9268 Q2 = -0.3145 0.0074 -0.9492 -0.9435 -0.1129 0.3117 -0.1048 0.9936 0.0425 R2 = -9.5394 -6.1849 -6.9187 0 7.3991 -0.6475 0 0 -1.9268 Q3 =-0.5345 0.1167 -0.8371 -0.2673 -0.9629 0.0364 -0.8018 0.2432 0.5459 R3 = -11.2250 -3.4744 -8.5524 -4.5434 0 -7.3436 -4.9411 -0.8462 0 0 -1.2010 -0.8007 E3 = 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0
6.4.3 特征值与特征向量
MATLAB中矩阵特征值与特征向量相关函数的调用格式及其功能如下:
(1)d = eig(A)
包含矩阵A的特征值向量d;
(2)[V, D] = eig(A)
求矩阵A的特征值在对角线上的对角矩阵D和矩阵V,满足AV=VD。
(3)d = eigs(A)
求由矩阵A的部分特征值组成的向量,最多计算6个特征值。
(4)[V, D] = eig(A, B)
求矩阵A的特征值向量V,和特征向量D(满足A*V = B*V*D)。
例6-44,矩阵特征值与特征向量计算示例。
在命令行窗口输入:
A = magic(3); [V, D] = eig(A) R= V*D-A*V
输出结果如下:
V = -0.5774 -0.8131 -0.3416 -0.5774 0.4714 -0.4714 -0.5774 0.3416 0.8131 D =15.0000 0 0 0 4.8990 0 0 0 -4.8990 R =1.0e-14 * -0.1776 -0.4885 -0.0888 -0.3553 -0.0444 -0.0444 0.1776 -0.1332 -0.1776
6.4.4 矩阵函数运算
MATLAB提供的部分矩阵运算函数及其功能如表6.4所示。
表6.4 矩阵运算函数
下面介绍这几个函数的用法。
1.矩阵指数运算
MATLAB提供函数expm用于矩阵指数的运算。其调用格式如下:
Y = expm(X)
该函数返回矩阵X的指数。满足:
[V, D] = EIG(X) 且expm (X) = V*diag(exp(diag(D)))/V。
例6-45, expm与exp函数对矩阵运算的比较示例。
在命令行窗口输入:
A = [1 1 0; 0 0 2; 0 0-1] expmA=expm(A) expA=exp(A)
输出结果如下:
A = 1 1 0 0 0 2 0 0 -1 expmA =2.7183 1.7183 1.0862 0 1.0000 1.2642 0 0 0.3679 expA =2.7183 2.7183 1.0000 1.0000 1.0000 7.3891 1.0000 1.0000 0.3679
2.矩阵对数运算
矩阵对数运算是矩阵指数运算的逆运算。MATLAB提供函数logm来实现矩阵对数运算,其调用格式如下:
L = logm(A) [L, exitflag] = logm(A)
其中,L为矩阵A的对数,exitflag为运算标识;当exitflag为0时,函数成功运行;当exitflag为1时,表明运算过程中某些泰勒级数不收敛,但运算结果仍可能精确。
例6-46,矩阵对数运算示例
在命令行窗口输入:
A = [1 1 0; 0 0 2; 0 0-1]; expmA=expm(A); A1=logm(expmA)
输出结果如下:
A1 =1.0000 1.0000 0.0000 0 0 2.0000 0 0 -1.0000
3.矩阵开方运算
MATLAB提供两种计算矩阵平方根的方法,分别为A^0.5形式运算和sqrtm(A)命令,但函数sqrtm比A^0.5的运算精度更高。
函数sqrtm的调用格式如下:
X = sqrtm(A)
函数返回矩阵A的平方根X,如果矩阵A是奇异的,将返回警告信息。
例6-47,矩阵开方运算示例。
在命令行窗口输入:
A = [7 10; 15 22] A=A*A B1=sqrtm(A) B2=A^0.5
输出结果如下:
A = 7 10 15 22 A =199 290 435 634 B1 =7.0000 10.0000 15.0000 22.0000 B2 =7.0000 10.0000 15.0000 22.0000
4.非线性矩阵函数运算
MATLAB提供了计算一般非线性矩阵函数运算的函数funm,其调用格式如下:
F = funm(A, fun)
该函数为方阵A进行fun函数的运算,返回方阵F。其中,fun为函数句柄,可以进行的调用格式如表6.5所示。
表6.5 非线性矩阵运算函数
例6-48,非线性矩阵函数运算示例。
在命令行窗口输入:
X=magic(3); E = expm(i*X); C1 = funm(X, @cos) C2 = real(E) S1 = funm(X, @sin) S2 = imag(E)
输出结果如下:
C1 =-0.1296 -0.3151 -0.3151 -0.3151 -0.1296 -0.3151 -0.3151 -0.3151 -0.1296 C2 =-0.1296 -0.3151 -0.3151 -0.3151 -0.1296 -0.3151 -0.3151 -0.3151 -0.1296 S1 =-0.3850 1.0191 0.0162 0.6179 0.2168 -0.1844 0.4173 -0.5856 0.8185 S2 =-0.3850 1.0191 0.0162 0.6179 0.2168 -0.1844 0.4173 -0.5856 0.8185