在线性代数中,矩阵分解或矩阵分解是将矩阵分解为矩阵的乘积。有许多不同的矩阵分解。其中之一就是Cholesky分解。
Cholesky分解或Cholesky分解是将Hermitian正定矩阵分解为下三角矩阵及其共轭转置的乘积。对于求解线性方程组,Cholesky分解的效率大约是LU分解的两倍。
埃尔米特式正定矩阵A的Cholesky分解是形式为A = [L] [L] T的分解,其中L是具有实对角线和正对角线项的下三角矩阵, L T表示L的共轭转置每个Hermitian正定矩阵(以及每个实值对称正定矩阵)都有唯一的Cholesky分解。
每个对称的正定矩阵A都可以分解成唯一的下三角矩阵L及其转置的乘积: A = LL T
通过求解上述下三角矩阵及其转置,可获得以下公式。这些是Cholesky分解算法的基础:
[Tex] L_ {i,j} = \ frac {1} {L_ {j,j}}(A_ {i,j}-\ sum_ {k = 0} ^ {j-1} L_ {i,k} L_ {j,k})[/ Tex]
范例:
Input :
Output :
下面是Cholesky分解的实现。
C++
// CPP program to decompose a matrix using
// Cholesky Decomposition
#include
using namespace std;
const int MAX = 100;
void Cholesky_Decomposition(int matrix[][MAX],
int n)
{
int lower[n][n];
memset(lower, 0, sizeof(lower));
// Decomposing a matrix into Lower Triangular
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
int sum = 0;
if (j == i) // summation for diagnols
{
for (int k = 0; k < j; k++)
sum += pow(lower[j][k], 2);
lower[j][j] = sqrt(matrix[j][j] -
sum);
} else {
// Evaluating L(i, j) using L(j, j)
for (int k = 0; k < j; k++)
sum += (lower[i][k] * lower[j][k]);
lower[i][j] = (matrix[i][j] - sum) /
lower[j][j];
}
}
}
// Displaying Lower Triangular and its Transpose
cout << setw(6) << " Lower Triangular"
<< setw(30) << "Transpose" << endl;
for (int i = 0; i < n; i++) {
// Lower Triangular
for (int j = 0; j < n; j++)
cout << setw(6) << lower[i][j] << "\t";
cout << "\t";
// Transpose of Lower Triangular
for (int j = 0; j < n; j++)
cout << setw(6) << lower[j][i] << "\t";
cout << endl;
}
}
// Driver Code
int main()
{
int n = 3;
int matrix[][MAX] = { { 4, 12, -16 },
{ 12, 37, -43 },
{ -16, -43, 98 } };
Cholesky_Decomposition(matrix, n);
return 0;
}
Java
// Java program to decompose
// a matrix using Cholesky
// Decomposition
class GFG {
// static int MAX = 100;
static void Cholesky_Decomposition(int[][] matrix,
int n)
{
int[][] lower = new int[n][n];
// Decomposing a matrix
// into Lower Triangular
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
int sum = 0;
// summation for diagnols
if (j == i) {
for (int k = 0; k < j; k++)
sum += (int)Math.pow(lower[j][k],
2);
lower[j][j] = (int)Math.sqrt(
matrix[j][j] - sum);
}
else {
// Evaluating L(i, j)
// using L(j, j)
for (int k = 0; k < j; k++)
sum += (lower[i][k] * lower[j][k]);
lower[i][j] = (matrix[i][j] - sum)
/ lower[j][j];
}
}
}
// Displaying Lower
// Triangular and its Transpose
System.out.println(" Lower Triangular\t Transpose");
for (int i = 0; i < n; i++) {
// Lower Triangular
for (int j = 0; j < n; j++)
System.out.print(lower[i][j] + "\t");
System.out.print("");
// Transpose of
// Lower Triangular
for (int j = 0; j < n; j++)
System.out.print(lower[j][i] + "\t");
System.out.println();
}
}
// Driver Code
public static void main(String[] args)
{
int n = 3;
int[][] matrix = new int[][] { { 4, 12, -16 },
{ 12, 37, -43 },
{ -16, -43, 98 } };
Cholesky_Decomposition(matrix, n);
}
}
// This code is contributed by mits
Python3
# 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
C#
// C# program to decompose
// a matrix using Cholesky
// Decomposition
using System;
class GFG {
// static int MAX = 100;
static void Cholesky_Decomposition(int[, ] matrix,
int n)
{
int[, ] lower = new int[n, n];
// Decomposing a matrix
// into Lower Triangular
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
int sum = 0;
// summation for diagnols
if (j == i) {
for (int k = 0; k < j; k++)
sum += (int)Math.Pow(lower[j, k],
2);
lower[j, j] = (int)Math.Sqrt(
matrix[j, j] - sum);
}
else {
// Evaluating L(i, j)
// using L(j, j)
for (int k = 0; k < j; k++)
sum += (lower[i, k] * lower[j, k]);
lower[i, j] = (matrix[i, j] - sum)
/ lower[j, j];
}
}
}
// Displaying Lower
// Triangular and its Transpose
Console.WriteLine(
" Lower Triangular\t Transpose");
for (int i = 0; i < n; i++) {
// Lower Triangular
for (int j = 0; j < n; j++)
Console.Write(lower[i, j] + "\t");
Console.Write("");
// Transpose of
// Lower Triangular
for (int j = 0; j < n; j++)
Console.Write(lower[j, i] + "\t");
Console.WriteLine();
}
}
// Driver Code
static int Main()
{
int n = 3;
int[, ] matrix = { { 4, 12, -16 },
{ 12, 37, -43 },
{ -16, -43, 98 } };
Cholesky_Decomposition(matrix, n);
return 0;
}
}
// This code is contributed by mits
PHP
输出:
Lower Triangular Transpose
2 0 0 2 6 -8
6 1 0 0 1 5
-8 5 3 0 0 3