當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Julia LinearAlgebra.cholesky用法及代碼示例


用法一

cholesky(A::SparseMatrixCSC; shift = 0.0, check = true, perm = nothing) -> CHOLMOD.Factor

計算稀疏正定矩陣的 Cholesky 分解A.A必須是SparseMatrixCSC或一個LinearAlgebra.Symmetric/LinearAlgebra.Hermitian一個視圖SparseMatrixCSC.請注意,即使A沒有類型標簽,它仍然必須是對稱的或 Hermitian。如果perm沒有給出,使用fill-reducing 排列。F = cholesky(A)最常用於求解方程組F\b, 還有方法LinearAlgebra.diag,LinearAlgebra.det, 和LinearAlgebra.logdet被定義為F.您還可以從F, 使用F.L.但是,由於默認情況下啟用了透視,因此分解在內部表示為A == P'*L*L'*P有一個置換矩陣P;隻使用L不考慮P會給出不正確的答案。為了包括排列的影響,通常最好提取 "combined" 因子,例如PtL = F.PtL(相當於P'*L) 和LtP = F.UP(相當於L'*P)。

check = true 時,如果分解失敗,則會引發錯誤。當 check = false 時,檢查分解的有效性(通過 issuccess )由用戶負責。

設置可選的 shift 關鍵字參數計算 A+shift*I 而不是 A 的分解。如果提供了perm 參數,它應該是1:size(A,1) 的排列,給出使用的順序(而不是 CHOLMOD 的默認 AMD 順序)。

例子

在以下示例中,使用的 fill-reducing 排列是 [3, 2, 1] 。如果 perm 設置為 1:3 以強製不進行置換,則因子中的非零元素數為 6。

julia> A = [2 1 1; 1 2 0; 1 0 2]
3×3 Matrix{Int64}:
 2  1  1
 1  2  0
 1  0  2

julia> C = cholesky(sparse(A))
SuiteSparse.CHOLMOD.Factor{Float64}
type:    LLt
method:  simplicial
maxnnz:  5
nnz:     5
success: true

julia> C.p
3-element Vector{Int64}:
 3
 2
 1

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421   0.0       0.0
 0.0       1.41421   0.0
 0.707107  0.707107  1.0

julia> L * L' ≈ A[C.p, C.p]
true

julia> P = sparse(1:3, C.p, ones(3))
3×3 SparseMatrixCSC{Float64, Int64} with 3 stored entries:
  ⋅    ⋅   1.0
  ⋅   1.0   ⋅
 1.0   ⋅    ⋅

julia> P' * L * L' * P ≈ A
true

julia> C = cholesky(sparse(A), perm=1:3)
SuiteSparse.CHOLMOD.Factor{Float64}
type:    LLt
method:  simplicial
maxnnz:  6
nnz:     6
success: true

julia> L = sparse(C.L);

julia> Matrix(L)
3×3 Matrix{Float64}:
 1.41421    0.0       0.0
 0.707107   1.22474   0.0
 0.707107  -0.408248  1.1547

julia> L * L' ≈ A
true

注意

此方法使用 SuiteSparse 中的 CHOLMOD 庫,該庫僅支持雙打或複雙打。不屬於這些元素類型的輸入矩陣將酌情轉換為SparseMatrixCSC{Float64}SparseMatrixCSC{ComplexF64}

CHOLMOD 中的許多其他函數都已包裝,但未從 Base.SparseArrays.CHOLMOD 模塊導出。

用法二

cholesky(A, Val(false); check = true) -> Cholesky

計算密集對稱正定矩陣 A 的 Cholesky 分解並返回 Cholesky 分解。矩陣 A 可以是 Symmetric Hermitian StridedMatrix perfectly 對稱或 Hermitian StridedMatrix

三角 Cholesky 因子可以通過 F.LF.U 從因式分解 F 獲得,其中 A ≈ F.U' * F.U ≈ F.L * F.L'

以下函數可用於 Cholesky 對象: size \ inv det logdet isposdef

如果您有一個矩陣 A 由於其構造中的舍入錯誤而略微非 Hermitian,請在將其傳遞給 cholesky 之前將其包裝在 Hermitian(A) 中,以便將其視為完美 Hermitian。

check = true 時,如果分解失敗,則會引發錯誤。當 check = false 時,檢查分解的有效性(通過 issuccess )由用戶負責。

例子

julia> A = [4. 12. -16.; 12. 37. -43.; -16. -43. 98.]
3×3 Matrix{Float64}:
   4.0   12.0  -16.0
  12.0   37.0  -43.0
 -16.0  -43.0   98.0

julia> C = cholesky(A)
Cholesky{Float64, Matrix{Float64}}
U factor:
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.U
3×3 UpperTriangular{Float64, Matrix{Float64}}:
 2.0  6.0  -8.0
  ⋅   1.0   5.0
  ⋅    ⋅    3.0

julia> C.L
3×3 LowerTriangular{Float64, Matrix{Float64}}:
  2.0   ⋅    ⋅
  6.0  1.0   ⋅
 -8.0  5.0  3.0

julia> C.L * C.U == A
true

用法三

cholesky(A, Val(true); tol = 0.0, check = true) -> CholeskyPivoted

計算密集對稱半正定矩陣A 的旋轉 Cholesky 分解並返回 CholeskyPivoted 分解。矩陣 A 可以是 Symmetric Hermitian StridedMatrix perfectly 對稱或 Hermitian StridedMatrix

三角 Cholesky 因子可以通過 F.LF.U 從因式分解 F 以及通過 F.p 的排列獲得,其中 A[F.p, F.p] ≈ Ur' * Ur ≈ Lr * Lr'Ur = F.U[1:F.rank, :]Lr = F.L[:, 1:F.rank]A ≈ Up' * Up ≈ Lp * Lp'Up = F.U[1:F.rank, invperm(F.p)]Lp = F.L[invperm(F.p), 1:F.rank]

以下函數可用於 CholeskyPivoted 對象: size \ inv det rank

參數tol 確定用於確定等級的容差。對於負值,公差是機器精度。

如果您有一個矩陣 A 由於其構造中的舍入錯誤而略微非 Hermitian,請在將其傳遞給 cholesky 之前將其包裝在 Hermitian(A) 中,以便將其視為完美 Hermitian。

check = true 時,如果分解失敗,則會引發錯誤。當 check = false 時,檢查分解的有效性(通過 issuccess )由用戶負責。

例子

julia> X = [1.0, 2.0, 3.0, 4.0];

julia> A = X * X';

julia> C = cholesky(A, Val(true), check = false)
CholeskyPivoted{Float64, Matrix{Float64}}
U factor with rank 1:
4×4 UpperTriangular{Float64, Matrix{Float64}}:
 4.0  2.0  3.0  1.0
  ⋅   0.0  6.0  2.0
  ⋅    ⋅   9.0  3.0
  ⋅    ⋅    ⋅   1.0
permutation:
4-element Vector{Int64}:
 4
 2
 3
 1

julia> C.U[1:C.rank, :]' * C.U[1:C.rank, :] ≈ A[C.p, C.p]
true

julia> l, u = C; # destructuring via iteration

julia> l == C.L && u == C.U
true

相關用法


注:本文由純淨天空篩選整理自julialang.org 大神的英文原創作品 LinearAlgebra.cholesky — Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。