用法一
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.L
和 F.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.L
和 F.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
相關用法
- Julia LinearAlgebra.cholesky!用法及代碼示例
- Julia LinearAlgebra.checksquare用法及代碼示例
- Julia LinearAlgebra.cross用法及代碼示例
- Julia LinearAlgebra.BLAS.dot用法及代碼示例
- Julia LinearAlgebra.bunchkaufman用法及代碼示例
- Julia LinearAlgebra.istriu用法及代碼示例
- Julia LinearAlgebra.istril用法及代碼示例
- Julia LinearAlgebra.stride1用法及代碼示例
- Julia LinearAlgebra.svd用法及代碼示例
- Julia LinearAlgebra.logdet用法及代碼示例
- Julia LinearAlgebra.eigen用法及代碼示例
- Julia LinearAlgebra.BLAS.dotu用法及代碼示例
- Julia LinearAlgebra.ldlt!用法及代碼示例
- Julia LinearAlgebra.I用法及代碼示例
- Julia LinearAlgebra.Transpose用法及代碼示例
- Julia LinearAlgebra.det用法及代碼示例
- Julia LinearAlgebra.tril!用法及代碼示例
- Julia LinearAlgebra.schur!用法及代碼示例
- Julia LinearAlgebra.tr用法及代碼示例
- Julia LinearAlgebra.axpby!用法及代碼示例
- Julia LinearAlgebra.adjoint!用法及代碼示例
- Julia LinearAlgebra.eigvecs用法及代碼示例
- Julia LinearAlgebra.LU用法及代碼示例
- Julia LinearAlgebra.isposdef!用法及代碼示例
- Julia LinearAlgebra.LQ用法及代碼示例
注:本文由純淨天空篩選整理自julialang.org 大神的英文原創作品 LinearAlgebra.cholesky — Function。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。