当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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