用法一
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。