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


R CHMfactor-class 稀疏 Cholesky 分解


R语言 CHMfactor-class 位于 Matrix 包(package)。

说明

CHMfactor 实对称矩阵 的稀疏 Cholesky 分解的虚拟类,具有一般形式

或(等效地)

其中 是置换矩阵, 是单位下三角矩阵, 是对角矩阵, 。第二个等式仅适用于正半定 ,其中 的对角线条目是非负的,并且 是明确定义的。

类的实现CHMfactor基于 CHOLMOD 的C-levelcholmod_factor_struct。虚拟子类CHMsimplCHMsuper分离单纯形和超节点变体。这些有非虚拟子类[dn]CHMsimpl[dn]CHMsuper,其中前缀‘⁠d⁠' 和前缀 '⁠n⁠' 分别保留用于数字和符号分解。

用法

isLDL(x)

参数

x

从虚拟类 CHMfactor 继承的对象,几乎总是调用泛型函数 Cholesky 的结果。

isLDL(x) 返回 TRUEFALSETRUE(如果 x 存储 的下三角条目)、FALSE(如果 x 存储 的下三角条目) 。

插槽

CHMfactor 的:

Dim , Dimnames

从虚拟类MatrixFactorization继承。

colcount

长度为 Dim[1] 的整数向量,给出下三角 Cholesky 因子每列中非零条目数量的估计。如果在因式分解之前进行符号分析,则估计是准确的。

perm

长度为 Dim[1] 的从 0 开始的整数向量,指定应用于因式分解矩阵的行和列的排列。长度为 0 的 perm 是有效的,相当于恒等排列,意味着没有旋转。

type

长度为 6 的整数向量,指定分解的细节。这些元素对应于原始 cholmod_factor_struct 的成员 orderingis_llis_superis_monotonicmaxcsizemaxesize 。单纯分解和超节点分解通过 is_super 来区分。单纯因式分解不使用 maxcsizemaxesize 。超节点分解不使用 is_llis_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 因子的列存储在 ix 中的顺序。从 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", ...) 等形式的调用直接生成,但 dCHMsimpldCHMsuper 更通常作为从 sparseMatrix 继承的 xCholesky(x, ...) 的值获得(通常是 dsCMatrix )。

目前除了调用 new 来生成 nCHMsimplnCHMsuper 之外,没有其他 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具有相同的非零模式,但数字条目根据附加参数进行更新parentmult,其中parent是(强制)adsCMatrix或一个dgCMatrixmult是正长度的数值向量。
数字条目更新为 Cholesky 因子的条目F(parent) + mult[1] * I, IE。,F(parent)mult[1]乘以单位矩阵,其中F = identity对于对称的parentF = 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

也可以看看

dsCMatrix

通用函数 Choleskyupdownexpand1expand2

相关用法


注:本文由纯净天空筛选整理自R-devel大神的英文原创作品 Sparse Cholesky Factorizations。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。