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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。