4.1 因式分解

本节介绍线性代数的一些基本操作,包括行列式、逆和秩,LU分解和QR分解,以及范数等。其中LU分解和QR分解都是使用对角线上方或者下方的元素均为0的三角矩阵来进行计算。使用三角矩阵表示的线性方程组,可以通过向前或者向后置换很容易地得出结果。

4.1.1 行列式、逆和秩

在MATLAB中,用户可以通过以下命令来计算矩阵A的行列式、逆和矩阵的秩。

(1)det(A):求方阵A的行列式。

(2)rank(A):求矩阵A的秩,即A中线性无关的行数和列数。

(3)inv(A):求方阵A的逆矩阵。如果A是奇异矩阵或者近似奇异矩阵,则会给出一个错误信息。

(4)pinv(A):求矩阵A的伪逆。如果A是m×n的矩阵,则伪逆的尺寸为n×m。对于非奇矩阵A来说,有pinv(A)=inv(A)。

(5)trance(A):求矩阵A的迹,也就是对角线元素之和。

下面用具体示例对矩阵行列式、逆和秩作简要的说明。

【例4-1】 矩阵的行列式计算示例。

det函数可以用来计算矩阵的行列式。

>>A1=[1 2;3 4] % 创建矩阵A1

A1 =

1 2

3 4

>> A2=[1 2;3,6] % 创建矩阵A2

A2 =

1 2

3 6

>> A3=[1 2;3 4;5 6] % 创建矩阵A3

A3 =

1 2

3 4

5 6

>>det1=det(A1) % 求方阵A1的行列式

det1 =

-2

>> det2=det(A2) %求方阵A2的行列式

det2 =

0

>> det3=det(A3) % 注意非方阵的行列式没有意义

??? Error using ==> det

Matrix must be square.

>> det_1=det(A1′) % 实数矩阵的行列式和它的转置的行列式相同

det_1 =

-2

>> det_2=det(A2′)

det_2 =

0

>> det_3=det(A3′)

??? Error using ==> det

Matrix must be square.

本例使用det函数计算A3的行列式时返回了错误信息,提醒用户A3必须是是方阵才可以调用det函数。

【例4-2】 矩阵的逆计算示例。

本例在上例创建的矩阵基础上进行演示。

>> inv1=inv(A1)

inv1 =

-2.0000 1.0000

1.5000 -0.5000

>>inv2=inv(A2) %A2行列式为0,不存在逆矩阵

Warning: Matrix is singular to working precision.

inv2 =

Inf Inf

Inf Inf

>> inv3=inv(A3) % 非方阵不存在逆矩阵

??? Error using ==> inv

Matrix must be square.

>> detinv1=det(inv(A1)) % A1的逆矩阵的行列式就等于1/det(A1)

detinv1 =

-0.5000

>> 1/det(A1)

ans =

-0.5000

【例4-3】 使用pinv函数计算矩阵的伪逆示例。

>> pinv1=pinv(A1) % A1的逆矩阵和它的伪逆是一样的

pinv1 =

-2.0000 1.0000

1.5000 -0.5000

>> pinv2=pinv(A2)

pinv2 =

0.0200 0.0600

0.0400 0.1200

>> pinv3=pinv(A3)

pinv3 =

-1.3333 -0.3333 0.6667

1.0833 0.3333 -0.4167

本例调用pinv函数计算了矩阵A1、A2、A3的伪逆。因为矩阵A2行列式为0,矩阵A3不是方阵正交矩阵的逆矩阵是它的转置,所以不能求矩阵A2和A3的逆,但是可以求这两个矩阵的伪逆。

【例4-4】 使用rank函数求解矩阵的秩示例。

>> rank1=rank(A1)

rank1 =

2

>> rank2=rank(A2)

rank2 =

1

>> rank3=rank(A3)

rank3 =

2

>> rank_1=rank(A1′)

rank_1 =

2

>> rank_2=rank(A2′)

rank_2 =

1

>> rank_3=rank(A3′)

rank_3 =

2

从本例中可以看出矩阵的秩和它的转置的秩相同。

通过上面的这4个例子,可以总结出以下规律。

(1)只有方阵的行列式才有意义。

(2)只有方阵的逆才有意义,但如果方阵的行列式为0,该方阵则不存在逆矩阵。

(3)如果方阵的逆矩阵存在,它的伪逆和逆相同。

(4)如果方阵的逆矩阵存在,它的逆矩阵的行列式det(A-1)等于1/det(A)。

(5)矩阵的秩和它的转置的秩相同。

(6)实数矩阵的行列式和它的转置矩阵的行列式相同。

4.1.2 Cholesky因式分解

分解法是将原方阵分解成一个上三角形矩阵(或是以不同次序排列的上三角阵)和一个下三角形矩阵,这样的分解法又称为三角分解法,它主要用于简化大矩阵行列式值的计算过程、求逆矩阵和求解联立方程组。需要注意的是:这种分解法所得到的上下三角阵并不是唯一的,可以找到多个不同的上下三角阵对,每对三角阵相乘都会得到原矩阵。

对线性系统的求解,MATLAB依据系数矩阵A的不同,而相应地使用不同的方法。如有可能,MATLAB会先分析矩阵的结构。例如A是对称且正定的,则使用Cholesky分解。

如果没有找到可以替代的方法正交矩阵的逆矩阵是它的转置,则采用高斯消元法和部分主元法,主要是对矩阵进行LU因式分解或LU分解。这种方法就是令A=LU,其中A是方阵,U是一个上三角矩阵,L是一个带有单位对角线的下三角矩阵。

Cholesky因式分解是把一个对称正定矩阵A分解为一个上三角矩阵R和其转置矩阵的乘积,其对应的表达式为:A=R’R。从理论上说,并不是所有的对称矩阵都可以进行Cholesky因式分解,只有正定矩阵才可以。

Pascal矩阵就是一个有趣的例子。下面以Pascal矩阵为例,说明Cholesky因式分解的使用方法。

【例4-5】 Cholesky因式分解示例。

>> A = pascal(6) %创建Pascal矩阵

A =

1 11 1 1 1

1 23 4 56

1 36 10 1521

1 410 20 3556

1 515 35 70126

1 621 56 126252

矩阵A的元素是二项式系数,每一个元素都是上方和左方两个元素的和。在MATLAB中,进行Cholesky因式分解的是chol函数。矩阵A的Cholesky因式分解可以通过以下命令得到:

>> R = chol(A)

R =

1 11 1 11

0 12 3 45

0 01 3 610

0 00 1 410

0 00 0 15

0 00 0 01

得到的矩阵R的元素同样也是二项式系数。

Cholesky因式分解允许线性方程组A x = b被R’Rx=b代替。在MATLAB环境中,这个线性方程组可以通过以下命令来求解:

>> x=R(R’b)

4.1.3 LU因式分解

LU分解法主要用于简化大矩阵行列式值的计算过程、求逆矩阵和求解联立方程组。需要注意的是:这种分解法得到的上下三角阵对并不是唯一的,可以找到多个不同的上下三角阵对,每对三角阵相乘都会得到原矩阵。

在MATLAB中,求矩阵A的LU分解的调用函数是lu,调用格式如下:

[L,U]=lu(A)

另外,矩阵A的LU分解为线性系统A*x=b提供了以下表达式来快速求解:

x=U(Lb)

【例4-6】 矩阵A的LU分解示例。

>> A=[5 2 0;2 6 2;5 6 7]

A =

5 20

2 62

5 67

>> [L,U]=lu(A) % 分解所得L是带有单位对角线的下三角矩阵,U是上三角矩阵

L =

1.0000 0 0

0.40001.0000 0

1.0000 0.7692 1.0000

U =

5.0000 2.0000 0

0 5.2000 2.0000

0 0 5.4615

>> L*U % 验证结果

ans =

5 20

2 62

5 67

【例4-7】 矩阵A的LU分解实例。

>> A=[1 2 3;4 5 6;7 8 9];

>> [L,U]=lu(A);

>> B=[9 8 7;6 5 4; 3 2 1];

>> x=U(LB)

Warning: Matrix is close to singular or badlyscaled.

Results may be inaccurate. RCOND =1.586033e-017.

x =

-27 -26-17

42 4124

-16 -16-8

>> A*x %验证结果

ans =

9 87

6 54

3 21

4.1.4 QR因式分解

如果A是正交矩阵,那么它满足A’A=1。二维坐标旋转变换矩阵就是一个简单的正交矩阵:

矩阵的正交分解又称做QR分解,是将矩阵分解成一个单位正交矩阵和上三角形矩阵。假设A是m×n的矩阵,那么A就可以分解成:

A=QR

其中Q是一个正交矩阵,R是一个维数和A相同的上三角矩阵,因此Ax=B可以表示为QRx=B或者等同于Rx=QB。这个方程组的系数矩阵是上三角的,因此容易求解。

在MATLAB中,用户可以调用函数qr来求QR因式分解,这个命令可用于分解m×n的矩阵,假设A是m×n的矩阵。qr函数常用调用格式有以下几种。

(1)[Q,R]=qr(A):求得m×m阶矩阵Q和m×n阶上三角矩阵R。Q和R满足A=QR。

(2)[Q,R,P]= qr(A):求得矩阵Q,上三角矩阵R和置换矩阵P。R的对角线元素按大小降序排列,且满足AP=QR。

(3)[Q,R]= qr(A,0):求矩阵A的QR因式分解。如果在m×n的矩阵A中行数小于列数,则给出Q的前n列。

(4)[Q1,R1]=gradelete(Q,R,j):求去掉矩阵A中第j列之后形成的矩阵的QR因式分解,矩阵Q和R是A的QR因子。

(5)[Q1,R1]=qrinset(Q,R,b,j):求在矩阵A的第j列前插入列向量b后形成的矩阵的QR因式分解,矩阵Q和R是A的QR因子。如果j=n+1,那么插入的一列放在最后。

【例4-8】 QR分解示例。已知魔方矩阵

对其进行QR分解。

用户只需要调用qr函数就可以实现对A进行QR分解。具体过程如下:

>> A=magic(3)

A =

8 16

3 57

4 92

>> [Q,R]=qr(A) % QR分解

Q =

-0.8480 0.52230.0901

-0.3180 -0.3655 -0.8748

-0.4240 -0.7705 0.4760

R =

-9.4340 -6.2540 -8.1620

0 -8.2394 -0.9655

0 0 -4.6314

>> Q*R % 验证结果

ans =

8.0000 1.0000 6.0000

3.0000 5.0000 7.0000

4.0000 9.0000 2.0000

【例4-9】 利用QR分解求线性方程组的解。

矩阵 转置 与 矩阵相乘_矩阵求逆和转置_正交矩阵的逆矩阵是它的转置

用户可以通过求A的QR分解并计算RQ’*B来求解X。具体过程如下:

>> A=[1 2 2;3 2 2;1 1 2]

A =

1 2 2

3 22

1 12

>> B=[7;9;5]

B =

7

9

5

>> [Q,R]=qr(A)

Q =

-0.3015 0.9239-0.2357

-0.9045 -0.3553-0.2357

-0.3015 0.14210.9428

R =

-3.3166 -2.7136-3.0151

0 1.27921.4213

0 00.9428

>> X=RQ’*B

X =

1.0000

2.0000

1.0000

>> AB

ans =

1.0000

2.0000

1.0000

4.1.5 范数

向量的范数是一个标量,用来衡量向量的长度。需注意不要把向量范数和向量中元素的个数相混淆。在MATLAB中,可以用命令norm得到不同的范数。

norm形式的表达式还有norm(x,-inf),但它不是求向量的范数,而是求向量x的绝对值的最小值,即min(abs(x))。请读者注意区分。

【例4-10】 向量范数的求解示例。

>> x=[2 4 5]

x =

2 45

>> norm1=norm(x) % 欧几里德范数

norm1 =

6.7082

>> norm2=norm(x,1) % 1-范数

norm2 =

11

>> norm3=norm(x,inf) %¥-范数

norm3 =

5

>> norm4=norm(x,4) % p-范数

norm4 =

5.4727

>> norm5=norm(x,-inf) %向量绝对值的最小值

norm5 =

2