1.Cholesky分解
在線性代數中,矩陣分解是將矩陣分解爲矩陣的乘積。有許多不同的矩陣分解。其中之一就是Cholesky分解。
Cholesky分解是將Hermitian正定矩陣分解爲下三角矩陣及其共軛轉置的乘積。在求解線性方程組時,Cholesky分解的效率大約是 分解的兩倍。
Hermitian正定矩陣 的Cholesky分解是形式爲的分解,其中是具有實對角線和正對角線項的下三角矩陣,表示 的共軛轉置。每個Hermitian正定矩陣(以及每個實值對稱正定矩陣)都有唯一的Cholesky分解。
每個對稱的正定矩陣都可以分解成唯一的下三角矩陣及其轉置的乘積:
通過求解上述下三角矩陣及其轉置,可獲得以下公式。 這些是Cholesky分解算法的基礎:
# Python3 program to decompose
# a matrix using Cholesky
# Decomposition
import math
MAX = 100;
def Cholesky_Decomposition(matrix, n):
lower = [[0 for x in range(n + 1)]
for y in range(n + 1)];
# Decomposing a matrix
# into Lower Triangular
for i in range(n):
for j in range(i + 1):
sum1 = 0;
# sum1mation for diagnols
if (j == i):
for k in range(j):
sum1 += pow(lower[j][k], 2);
lower[j][j] = int(math.sqrt(matrix[j][j] - sum1));
else:
# Evaluating L(i, j)
# using L(j, j)
for k in range(j):
sum1 += (lower[i][k] *lower[j][k]);
if(lower[j][j] > 0):
lower[i][j] = int((matrix[i][j] - sum1) /
lower[j][j]);
# Displaying Lower Triangular
# and its Transpose
print("Lower Triangular\t\tTranspose");
for i in range(n):
# Lower Triangular
for j in range(n):
print(lower[i][j], end = "\t");
print("", end = "\t");
# Transpose of
# Lower Triangular
for j in range(n):
print(lower[j][i], end = "\t");
print("");
# Driver Code
n = 3;
matrix = [[4, 12, -16],
[12, 37, -43],
[-16, -43, 98]];
Cholesky_Decomposition(matrix, n);
# This code is contributed by mits
2.Doolittle 算法:LU分解
在數值分析和線性代數中,分解(其中 表示“ lower upper”,也稱爲因式分解)將矩陣分解爲下三角矩陣和上三角矩陣的乘積。 計算機通常使用分解求解線性方程組的平方系統,這也是求矩陣求逆或計算矩陣行列式時的關鍵步驟。
設爲方陣。分解是指將具有適當的行/列排序,或置換的分解爲兩個因子,即下三角矩陣和上三角矩陣, 。
# Python3 Program to decompose
# a matrix into lower and
# upper traingular matrix
MAX = 100;
def luDecomposition(mat, n):
lower = [[0 for x in range(n)]
for y in range(n)];
upper = [[0 for x in range(n)]
for y in range(n)];
# Decomposing matrix into Upper
# and Lower triangular matrix
for i in range(n):
# Upper Triangular
for k in range(i, n):
# Summation of L(i, j) * U(j, k)
sum = 0;
for j in range(i):
sum += (lower[i][j] * upper[j][k]);
# Evaluating U(i, k)
upper[i][k] = mat[i][k] - sum;
# Lower Triangular
for k in range(i, n):
if (i == k):
lower[i][i] = 1; # Diagonal as 1
else:
# Summation of L(k, j) * U(j, i)
sum = 0;
for j in range(i):
sum += (lower[k][j] * upper[j][i]);
# Evaluating L(k, i)
lower[k][i] = int((mat[k][i] - sum) /
upper[i][i]);
# setw is for displaying nicely
print("Lower Triangular\t\tUpper Triangular");
# Displaying the result :
for i in range(n):
# Lower
for j in range(n):
print(lower[i][j], end = "\t");
print("", end = "\t");
# Upper
for j in range(n):
print(upper[i][j], end = "\t");
print("");
# Driver code
mat = [[2, -1, -2],
[-4, 6, 3],
[-4, -2, 8]];
luDecomposition(mat, 3);
# This code is contributed by mits