CHMfactor-class 位于 Matrix 包(package)。 说明
CHMfactor 是 实对称矩阵 的稀疏 Cholesky 分解的虚拟类,具有一般形式
或(等效地)
其中 是置换矩阵, 是单位下三角矩阵, 是对角矩阵, 。第二个等式仅适用于正半定 ,其中 的对角线条目是非负的,并且 是明确定义的。
类的实现CHMfactor基于 CHOLMOD 的C-levelcholmod_factor_struct。虚拟子类CHMsimpl和CHMsuper分离单纯形和超节点变体。这些有非虚拟子类[dn]CHMsimpl和[dn]CHMsuper,其中前缀‘d' 和前缀 'n' 分别保留用于数字和符号分解。
用法
isLDL(x)
参数
x |
从虚拟类 |
值
isLDL(x) 返回 TRUE 或 FALSE :TRUE(如果 x 存储 的下三角条目)、FALSE(如果 x 存储 的下三角条目) 。
插槽
CHMfactor 的:
Dim,Dimnames-
从虚拟类
MatrixFactorization继承。 colcount-
长度为
Dim[1]的整数向量,给出下三角 Cholesky 因子每列中非零条目数量的估计。如果在因式分解之前进行符号分析,则估计是准确的。 perm-
长度为
Dim[1]的从 0 开始的整数向量,指定应用于因式分解矩阵的行和列的排列。长度为 0 的perm是有效的,相当于恒等排列,意味着没有旋转。 type-
长度为 6 的整数向量,指定分解的细节。这些元素对应于原始
cholmod_factor_struct的成员ordering、is_ll、is_super、is_monotonic、maxcsize和maxesize。单纯分解和超节点分解通过is_super来区分。单纯因式分解不使用maxcsize或maxesize。超节点分解不使用is_ll或is_monotonic。
CHMsimpl 的(全部被 nCHMsimpl 未使用):
nz-
长度为
Dim[1]的整数向量,给出下三角 Cholesky 因子每列中非零条目的数量。每列中至少有一个非零条目,因为因子的对角线元素是显式存储的。 p-
长度为
Dim[1]+1的整数向量。下三角 Cholesky 因子的列j中非零条目的行索引作为i[p[j]+seq_len(nz[j])]+1获得。 i-
长度大于或等于
sum(nz)的整数向量,包含下三角 Cholesky 因子中非零条目的行索引。它们按列分组并在列内排序,但列本身不需要单调排序。列可能被过度分配,即,为列j保留的i的元素数量可能超过nz[j]。 prv,nxt-
长度为
Dim[1]+2的整数向量指示下三角 Cholesky 因子的列存储在i和x中的顺序。从j <- Dim[1]+2开始,递归j <- nxt[j+1]+1向前顺序遍历列,并在nxt[j+1] = -1时终止。从j <- Dim[1]+1开始,递归j <- prv[j+1]+1按向后顺序遍历列,并在prv[j+1] = -1时终止。
dCHMsimpl 的:
x-
与
i平行的数值向量,包含下三角 Cholesky 因子 或(当且仅当type[2]为 0)下三角矩阵 的相应非零条目。
CHMsuper 的:
super,pi,px-
长度为
nsuper+1的整数向量,其中nsuper是超级节点的数量。super[j]+1是超级节点j最左列的索引。超级节点j的行索引被获取为s[pi[j]+seq_len(pi[j+1]-pi[j])]+1。超级节点j的数字条目作为x[px[j]+seq_len(px[j+1]-px[j])]+1获得(如果槽x可用)。 s-
长度大于或等于
Dim[1]的整数向量,包含超级节点的行索引。s可能包含重复项,但不能在超级节点内,其中行索引必须递增。
dCHMsuper 的:
x-
长度小于或等于
prod(Dim)的数值向量,包含超级节点的数值条目。
扩展
直接类 MatrixFactorization 。
实例化
对象可以通过 new("dCHMsimpl", ...) 等形式的调用直接生成,但 dCHMsimpl 和 dCHMsuper 更通常作为从 sparseMatrix 继承的 x 的 Cholesky(x, ...) 的值获得(通常是 dsCMatrix )。
目前除了调用 new 来生成 nCHMsimpl 和 nCHMsuper 之外,没有其他 API。这些类是残留的,可能会在 Matrix 的未来版本中正式弃用。
方法
coerce-
signature(from = "CHMsimpl", to = "dtCMatrix"):返回表示下三角 Cholesky 因子 或下三角矩阵 的dtCMatrix,后者当且仅当from@type[2]为 0 时。 coerce-
signature(from = "CHMsuper", to = "dgCMatrix"):返回表示下三角 Cholesky 因子 的dgCMatrix。请注意,对于跨越两列或更多列的超级节点,超节点算法按设计将非结构零存储在主对角线上方,因此dgCMatrix确实比dtCMatrix作为强制目标更合适。 determinant-
signature(from = "CHMfactor", logarithm = "logical"):根据可选参数sqrt进行行为。如果sqrt = FALSE,则此方法计算因式分解矩阵 的行列式或其对数。如果sqrt = TRUE,则此方法计算因子 或其对数的行列式,当 具有负对角线元素时,给出NaN的模数。为了向后兼容,sqrt的默认值是TRUE,但是在Matrix的未来版本中预计会发生变化,因此防御代码将始终设置sqrt(如果代码必须设置为TRUE)保持向后兼容Matrix< 1.6-0)。调用此方法而不设置sqrt可能会警告有关待处理的更改。可以使用options(Matrix.warnSqrtDefault = 0)禁用警告。 diag-
signature(x = "CHMfactor"):返回长度为 的数值向量,其中包含 的对角线元素,其中(如果它们均为非负)是 的平方对角线元素。 expand-
signature(x = "CHMfactor"):参见expand-methods。 expand1-
signature(x = "CHMsimpl"):参见expand1-methods。 expand1-
signature(x = "CHMsuper"):参见expand1-methods。 expand2-
signature(x = "CHMsimpl"):参见expand2-methods。 expand2-
signature(x = "CHMsuper"):参见expand2-methods。 image-
signature(x = "CHMfactor"):参见image-methods。 nnzero-
signature(x = "CHMfactor"):参见nnzero-methods。 solve-
signature(a = "CHMfactor", b = .):参见solve-methods。 update-
signature(object = "CHMfactor"): 返回一个副本object具有相同的非零模式,但数字条目根据附加参数进行更新parent和mult,其中parent是(强制)adsCMatrix或一个dgCMatrix和mult是正长度的数值向量。
数字条目更新为 Cholesky 因子的条目F(parent) + mult[1] * I, IE。,F(parent)加mult[1]乘以单位矩阵,其中F = identity对于对称的parent和F = tcrossprod对于他人parent。非零模式F(parent)必须匹配S如果object = Cholesky(S, ...). updown-
signature(update = ., C = ., object = "CHMfactor"):参见updown-methods。
例子
showClass("dCHMsimpl")
showClass("dCHMsuper")
set.seed(2)
m <- 1000L
n <- 200L
M <- rsparsematrix(m, n, 0.01)
A <- crossprod(M)
## With dimnames, to see that they are propagated :
dimnames(A) <- dn <- rep.int(list(paste0("x", seq_len(n))), 2L)
(ch.A <- Cholesky(A)) # pivoted, by default
str(e.ch.A <- expand2(ch.A, LDL = TRUE), max.level = 2L)
str(E.ch.A <- expand2(ch.A, LDL = FALSE), max.level = 2L)
ae1 <- function(a, b, ...) all.equal(as(a, "matrix"), as(b, "matrix"), ...)
ae2 <- function(a, b, ...) ae1(unname(a), unname(b), ...)
## A ~ P1' L1 D L1' P1 ~ P1' L L' P1 in floating point
stopifnot(exprs = {
identical(names(e.ch.A), c("P1.", "L1", "D", "L1.", "P1"))
identical(names(E.ch.A), c("P1.", "L" , "L." , "P1"))
identical(e.ch.A[["P1"]],
new("pMatrix", Dim = c(n, n), Dimnames = c(list(NULL), dn[2L]),
margin = 2L, perm = invertPerm(ch.A@perm, 0L, 1L)))
identical(e.ch.A[["P1."]], t(e.ch.A[["P1"]]))
identical(e.ch.A[["L1."]], t(e.ch.A[["L1"]]))
identical(E.ch.A[["L." ]], t(E.ch.A[["L" ]]))
identical(e.ch.A[["D"]], Diagonal(x = diag(ch.A)))
all.equal(E.ch.A[["L"]], with(e.ch.A, L1 %*% sqrt(D)))
ae1(A, with(e.ch.A, P1. %*% L1 %*% D %*% L1. %*% P1))
ae1(A, with(E.ch.A, P1. %*% L %*% L. %*% P1))
ae2(A[ch.A@perm + 1L, ch.A@perm + 1L], with(e.ch.A, L1 %*% D %*% L1.))
ae2(A[ch.A@perm + 1L, ch.A@perm + 1L], with(E.ch.A, L %*% L. ))
})
## Factorization handled as factorized matrix
## (in some cases only optionally, depending on arguments)
b <- rnorm(n)
stopifnot(identical(det(A), det(ch.A, sqrt = FALSE)),
identical(solve(A, b), solve(ch.A, b, system = "A")))
u1 <- update(ch.A, A , mult = sqrt(2))
u2 <- update(ch.A, t(M), mult = sqrt(2)) # updating with crossprod(M), not M
stopifnot(all.equal(u1, u2, tolerance = 1e-14))
参考
The CHOLMOD source code; see
https://github.com/DrTimothyAldenDavis/SuiteSparse,
notably the header file ‘CHOLMOD/Include/cholmod.h’
defining cholmod_factor_struct.
Chen, Y., Davis, T. A., Hager, W. W., & Rajamanickam, S. (2008). Algorithm 887: CHOLMOD, supernodal sparse Cholesky factorization and update/downdate. ACM Transactions on Mathematical Software, 35(3), Article 22, 1-14. doi:10.1145/1391989.1391995
Amestoy, P. R., Davis, T. A., & Duff, I. S. (2004). Algorithm 837: AMD, an approximate minimum degree ordering algorithm. ACM Transactions on Mathematical Software, 17(4), 886-905. doi:10.1145/1024074.1024081
Golub, G. H., & Van Loan, C. F. (2013). Matrix computations (4th ed.). Johns Hopkins University Press. doi:10.56021/9781421407944
也可以看看
相关用法
- R Cholesky-methods Cholesky 分解方法
- R CAex 阿尔伯斯的示例矩阵与“困难”特征分解
- R CsparseMatrix-class 列压缩形式稀疏矩阵的“CsparseMatrix”类
- R Cholesky-class 密集 Cholesky 分解
- R dtrMatrix-class 三角形稠密数值矩阵
- R facmul-methods 乘以矩阵因式分解的因数
- R solve-methods 函数求解矩阵包中的方法
- R updown-methods 更新和降级稀疏 Cholesky 分解
- R bdiag 构建分块对角矩阵
- R printSpMatrix 灵活格式化和打印稀疏矩阵
- R symmetricMatrix-class 包矩阵中对称矩阵的虚拟类
- R all.equal-methods 函数 all.equal() 的矩阵封装方法
- R boolmatmult-methods 布尔算术矩阵乘积:%&% 和方法
- R ltrMatrix-class 三角密集逻辑矩阵
- R Hilbert 生成希尔伯特矩阵
- R nearPD 最近正定矩阵
- R lsyMatrix-class 对称密集逻辑矩阵
- R symmpart-methods 矩阵的对称部分和偏斜(对称)部分
- R sparseMatrix 从非零项构建一般稀疏矩阵
- R dgCMatrix-class 压缩、稀疏、面向列的数值矩阵
- R Subassign-methods “[<-”的方法 - 分配给“矩阵”的子集
- R ldenseMatrix-class 密集逻辑矩阵的虚拟类“ldenseMatrix”
- R norm-methods 矩阵范数
- R ngeMatrix-class 一般密集非零模式矩阵的“ngeMatrix”类
- R diagonalMatrix-class 对角矩阵的“diagonalMatrix”类
注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Sparse Cholesky Factorizations。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
