3.4 矩阵运算(1)
矩阵运算是线性代数中极其重要的部分。本节将介绍MATLAB中与矩阵运算相关的内容,包括矩阵分析、矩阵分解、特征值和特征向量等。
3.4.1 矩阵分析
MATLAB提供的矩阵分析函数如表3-2所示。
表3-2 矩阵分析函数
函数 |
功能描述 |
norm |
求矩阵或向量空间的范数 |
normest |
估计矩阵的2阶范数 |
rank |
矩阵的秩,即求对角元素的和 |
det |
矩阵的行列式 |
trace |
矩阵的迹 |
null |
0空间 |
orth |
正交化空间 |
rref |
约化行阶梯形式 |
subspace |
求两个矩阵空间的角度 |
1.向量和矩阵的范数运算
对于线性空间中的一个向量x={x1 ,x2 ,…,xn},如果存在一个函数r(x)满足以下3个条件:
(1)r(x)>0,且r(x)=0的充要条件为x=0。
(2)r(ax)=|a|r(x),其中a为任意标量。
(3)对向量x和y,有r(x+y)≤r(x)+r(y)。
则称r(x)为向量x的范数,一般记为||x||。范数的形式多种多样,下面式子中定义的范数操作就满足以上3个条件:
式中定义的 ||x||p称为p阶范数,其中最有用的是1、2和∞阶范数。
矩阵的范数是基于向量的范数定义的,其定义式如下:
与向量的范数一样,矩阵的范数最常用的也是1、2、∞阶范数和F范数,它们的定义式如下:
在上式中, Smax{ATA}则为ATA的最大特征值。
矩阵的1范数:将矩阵沿列方向取绝对值求和,取最大值作为1范数。
对于实矩阵,矩阵A的2范数定义为:A的转置与A乘积的最大特征值开平方根。
矩阵A的∞范数定义为:沿着行方向取绝对值求和,取最大值。
在MATLAB中,求向量范数的函数的具体用法如下。
● N=norm(x,p):对任意大于1的p值,返回向量x的p阶范数。
● N=norm(x):返回向量的2阶范数,相当于N=norm(x,2)。
● N=norm(x,inf):返回向量的∞阶范数,相当于N=max(abs(x))。
● N=norm(x,-inf):返回向量的-∞阶范数,相当于N=min(abs(x))。
在MATLAB中,求矩阵范数的函数的具体用法如下。
● 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范数),相当于sqrt(sum(diag(A'*A)))。
例3-36:求向量x的2阶范数示例。
在命令行窗口中输入:
x = 1:6 N1 = norm(x) N2 = norm(x,1) N3 = norm(x,2) N4 = norm(x,inf) N5 = norm(x,-inf)
输出结果:
x = 1 2 3 4 5 6 N1 = 9.5394 N2 = 21 N3 = 9.5394 N4 = 6 N5 = 1
注意:当矩阵维数比较大时,会导致计算矩阵范数的时间比较长,并且当一个近似的范数值满足要求时,可以考虑使用函数normest()来估计2阶范数值。函数normest()最初开发时是为了提供给稀疏矩阵使用的,同时它也能接收满矩阵的输入,一般在满矩阵维数比较大时使用。
函数normest()的用法如下。
● normest(S):估计矩阵S的2阶范数值。
● normest(S,tol):使用tol作为允许的相对误差。
例3-37:求矩阵的范数示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;4 5 6;7 8 9]; b = norm(A,1); % 矩阵A的1阶范数 c = norm(A); % 矩阵A的2阶范数 d = norm(A,inf); % 矩阵A的∞阶范数 e = norm(A, 'fro'); % 矩阵A的Frobenius范数 f = normest(A); % 矩阵A的2阶范数的估计值 bcdef = [b c d e f]
输出结果:
bcdef = 18.0000 16.8481 24.0000 16.8819 16.8481
2.矩阵的秩
矩阵A中线性无关的列向量个数称为列秩,线性无关的行向量个数称为行秩。在MATLAB中用函数rank()来计算矩阵的秩。函数rank()的用法如下。
● rank(A):用默认允许误差计算矩阵的秩。
● rank(A,tol):给定允许误差计算矩阵的秩,tol=max(size(A))·eps(norm(A))。
例3-38:求矩阵的秩示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;4 5 6;7 8 9]; B = magic(3); r1 = rank(A) r2 = rank(B)
输出结果:
r1 = 2 r2 = 3
3.矩阵的行列式
矩阵A={aij}n×n的行列式定义如下:
其中,k1 ,k2 ,…,kn是将序列1,2,…,n交换k次所得的序列。在MATLAB中用函数det()来计算矩阵的行列式。
例3-39:计算矩阵的行列式示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;4 5 6;7 8 9]; B = magic(5); r1 = det(A) r2 = det(B) disp(['A的行列式值 = ',num2str(r1)]) disp(['B的行列式值 = ',num2str(r2)])
输出结果:
r1 = -9.5162e-16 r2 = 5.0700e+06 A的行列式值 = -9.5162e-16 B的行列式值 = 5070000
注意:在 MATLAB 中,当计算一个矩阵的行列式值时,如果得到的结果非常接近零,例如 -9.5162e-16,通常表示该矩阵的行列式值非常接近于零,但由于计算精度限制,结果被舍入为科学计数法表示。因此,在比较行列式值与零或进行其他精确计算时,应当谨慎处理,避免舍入误差对计算结果产生影响。如果需要更高的数值精度,可以考虑使用 MATLAB 提供的 Symbolic Math Toolbox 进行精确计算。
4.矩阵的迹
矩阵的迹定义为矩阵对角元素之和。在MATLAB中用函数trace()来计算矩阵的迹。
例3-40:计算矩阵的迹示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;4 5 6;7 8 9]; B = magic(5); r1 = trace(A) r2 = trace(B) disp(['A的迹 = ',num2str(r1)]) disp(['B的迹 = ',num2str(r2)])
输出结果:
r1 = 15 r2 = 65 A的迹 = 15 B的迹 = 65
5.矩阵的化零矩阵
MATLAB中提供了求化零矩阵的函数null(),其用法如下。
● Z=null(A):返回矩阵A的一个化零矩阵,如果化零矩阵不存在,则返回空矩阵。
● Z=null(A,'r'):返回有理数形式的化零矩阵。
例3-41:求矩阵的化零矩阵示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;4 5 6;7 8 9]; Z = null(A) AZ = A * Z ZR = null(A, 'r ') AZR = A * ZR
输出结果:
Z = -0.4082 0.8165 -0.4082 AZ = 1.0e-15 * -0.4441 0 0.4441 ZR = -0.4082 0.8165 -0.4082 AZR = 1.0e-15 * -0.4441 0 0.4441
6.矩阵的正交空间
矩阵A的正交空间Q具有Q'·Q=I的性质,并且Q的列矢量构成的线性空间与矩阵A的列矢量构成的线性空间相同,且正交空间Q与矩阵A具有相同的秩。MATLAB中提供了函数orth()来求正交空间Q。
例3-42:矩阵的正交空间求解示例。
在命令行窗口中依次输入:
clear all A = magic(3) Q = orth(A)
输出结果:
A = 8 1 6 3 5 7 4 9 2 Q = -0.5774 0.7071 0.4082 -0.5774 0.0000 -0.8165 -0.5774 -0.7071 0.4082
7.矩阵的约化行阶梯形式
矩阵的约化行阶梯形式是高斯-约旦消去法解线性方程组的结果,其形式为:
MATLAB中提供了函数rref()来求矩阵的约化行阶梯形式,其用法如下。
● R=rref(A):返回矩阵A的约化行阶梯形式R。
● [R,jb]=rref(A):返回矩阵A的约化行阶梯形式R,并返回1×r的向量jb,r为矩阵A的秩;A(:,jb)是矩阵A的列矢量构成的线性空间;R(1:r,jb)是r×r的单位矩阵。
● [R,jb]=rref(A,tol):以tol作为允许的相对误差计算矩阵A的秩。
例3-43:求矩阵A的约化行阶梯形式示例。
在命令行窗口中依次输入:
A = [1 2 3;4 5 6;7 8 9;10 11 12]; % 矩阵A R = rref(A) % 正交矩阵A的约化行阶梯形式
输出结果:
R = 1 0 -1 0 1 2 0 0 0 0 0 0
8.矩阵空间之间的夹角
矩阵空间之间的夹角代表两个矩阵线性相关的程度。如果夹角很小,它们之间的线性相关度就很高;反之,它们之间的线性相关度就很低。在MATLAB中用函数subspace()来实现求矩阵空间之间的夹角,其调用格式如下。
● theta=subspace(A,B):返回矩阵A和矩阵B之间的夹角。
例3-44:求矩阵A和矩阵B之间的夹角示例。
在命令行窗口中依次输入:
clear all A = [1 2 3;3 4 5;7 8 9;8 7 9;0 2 8]; B = magic(5); subspace(A,B)
输出结果:
ans = 9.6980e-16