Cholesky矩阵分解


TOC

  • 介绍(introductions)
  • 算法(algorithm)
  • 代码(code)

1. 介绍

Cholesky 分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。它要求矩阵的所有特征值必须大于零,故分解的下三角的对角元也是大于零的。Cholesky分解法又称平方根法,是当A为实对称正定矩阵时,LU三角分解法的变形。其中L称之为矩阵A的Cholesky 因子。

2. 算法

以3x3的矩阵为例,算法如下
LL

3. 代码

fortran 代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
!  Cholesky_decomposition.f90
!
!****************************************************************************
!
! PROGRAM: Cholesky_decomposition
!
! PURPOSE: Use the Cholesky method to decopose a positive definite matrix ,S=L*L'
! here L' is transpose matrix of L. We then obtain the inverse matrix of S and L
! matrix as an output.
!
!****************************************************************************

program Cholesky_decomposition

implicit none

! Variables
integer::i,j,k
real(kind=8)::summ
real(kind=8)::S(3,3)=(/ 1.0,1.0,1.0,1.0,5.0,3.0,1.0,3.0,11.0 /)
real(kind=8)::L(3,3),L_inv(3,3),L_inv_T(3,3),S_inv(3,3)
real(kind=8),intrinsic::sqrt,transpose,matmul
! Body of Cholesky_decomposition for the positive definite matrix S
write(*,*),"S matrix"
write(*,"(3(f12.6,2x))"),S
! L(1,1)=sqrt(S(1,1))
do i=1,3
do j=1,3

if(i>j)then
summ=0.0
do k=1,j-1
summ=summ+L(i,k)*L(j,k)
end do
L(i,j)=(S(i,j)-summ)/L(j,j)
elseif(i==j)then
summ=0.0
do k=1,i-1
summ=summ+L(i,k)**2
end do
L(i,j)=sqrt(S(i,j)-summ)
else
L(i,j)=0.0
end if


end do
end do
write(*,*)"L matrix"
write(*,"(3(f12.6,2x))"),((L(j,i),i=1,3),j=1,3)
!!calculate the inverse matrix of L matrix ,at the same time
!! S matrix by be sovled with sqare root method
do i=1,3
do j=1,3
if(i==j)then
L_inv(i,j)=1/L(i,j)
elseif(i>j)then
summ=0.0
do k=1,i-1
summ=summ+L(i,k)*L_inv(k,j)
end do
L_inv(i,j)=-1*summ/L(i,i)
else
L_inv(i,j)=0.0
end if
end do
end do
write(*,*)"L_inv matrix"
write(*,"(3(f12.6,2x))"),((L_inv(j,i),i=1,3),j=1,3)
L_inv_T=transpose(L_inv)
S_inv=matmul(L_inv_T,L_inv)
write(*,*)"S_inv matrix"
write(*,"(3(f12.6,2x))"),((S_inv(j,i),i=1,3),j=1,3)
end program Cholesky_decomposition

通过ifort进行编译,执行

1
2
ifort Cholesky_decomposition.f90 -o cd.x
./cd.x

可以得到如下结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
S matrix
1.000000 1.000000 1.000000
1.000000 5.000000 3.000000
1.000000 3.000000 11.000000
L matrix
1.000000 0.000000 0.000000
1.000000 2.000000 0.000000
1.000000 1.000000 3.000000
L_inv matrix
1.000000 0.000000 0.000000
-0.500000 0.500000 0.000000
-0.166667 -0.166667 0.333333
S_inv matrix
1.277778 -0.222222 -0.055556
-0.222222 0.277778 -0.055556
-0.055556 -0.055556 0.111111

文章作者: ustc-haidi
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ustc-haidi !
  目录