sparseQR-class
位於 Matrix
包(package)。 說明
sparseQR
是 ( ) 實數矩陣的稀疏、行和 column-pivoted QR 分解類,具有一般形式
或(等效地)
其中 和 是置換矩陣, 是 正交矩陣( 包含第一個 列向量),等於 Householder 矩陣 的乘積, 和 是具有非負對角線元素的 上梯形矩陣( 包含第一個 行向量,並且是上三角矩陣)。
用法
qrR(qr, complete = FALSE, backPermute = TRUE, row.names = TRUE)
參數
qr |
類 |
complete |
指示是否應返回 而不是 的邏輯。 |
backPermute |
一個邏輯,指示 或 是否應在右側乘以 。 |
row.names |
一個邏輯,指示 |
細節
qr.Q
的方法不會返回 ,而是返回(也是正交的)乘積 。此行為在代數上與 base
實現一致(請參閱 qr
),可以通過注意到 base
中的 qr.default
不旋轉行來看出這一點,從而將 限製為單位矩陣。因此 qr.Q(qr.default(x))
也返回 。
同樣, qr.qy
和 qr.qty
的方法在左側乘以 和 而不是 和 。
預期 qr.Q
(或 qr.R
、 qr.qy
、 qr.qty
)的值是根據 “equivalent” 稀疏和密集分解(例如,qr(x)
和 qr(as(x, "matrix"))
對於類的 x
計算得出的)是錯誤的dgCMatrix
) 比較相等。底層分解算法有很大不同,特別是它們采用不同的旋轉策略,並且一般來說,即使對於固定的 和 ,分解也不是唯一的。
另一方麵, qr.X
、 qr.coef
、 qr.fitted
和 qr.resid
的值是明確定義的,在這些情況下,稀疏和密集計算應該比較相等(在一定的容差範圍內)。
qr.R
的方法是 qrR
的簡單包裝,但默認情況下不是 back-permuting 並且從不給出行名稱。它不支持 backPermute = TRUE
直到 Matrix
1.6-0
,因此如果 Matrix
>= 1.6-0
未知,則需要 back-permuted 結果的代碼應調用 qrR
。
插槽
Dim
,Dimnames
-
從虛擬類
MatrixFactorization
繼承。 beta
-
長度為
Dim[2]
的數值向量,用於構造 Householder 矩陣;請參閱下麵的V
。 V
-
具有
Dim[2]
列的類dgCMatrix
的對象。行數nrow(V)
至少為Dim[1]
且最多為Dim[1]+Dim[2]
。V
是下梯形,其列向量生成組成正交 因子的 Householder 矩陣 。具體來說, 被構造為diag(Dim[1]) - beta[j] * tcrossprod(V[, j])
。 R
-
類
dgCMatrix
的對象,具有nrow(V)
行和Dim[2]
列。R
是具有非負對角線元素的上梯形 因子。 p
,q
-
長度從 0 開始的整數向量
nrow(V)
和Dim[2]
,分別指定應用於因式分解矩陣的行和列的排列。q
長度為 0 的值是有效的並且等價於恒等排列,意味著沒有列旋轉。使用R語法,矩陣 正是A[p+1, q+1]
(A[p+1, ]
當q
長度為 0)。
擴展
直接類 QR
。類 MatrixFactorization
,按類 QR
,距離 2。
實例化
對象可以通過 new("sparseQR", ...)
形式的調用直接生成,但它們更通常作為繼承自 sparseMatrix
(通常是 dgCMatrix
)的 x
的 qr(x)
值獲得。
方法
determinant
-
signature(from = "sparseQR", logarithm = "logical")
:計算因式分解矩陣 的行列式或其對數。 expand1
-
signature(x = "sparseQR")
:參見expand1-methods
。 expand2
-
signature(x = "sparseQR")
:參見expand2-methods
。 qr.Q
-
signature(qr = "sparseQR")
:返回dgeMatrix
或 ,具體取決於可選參數complete
。默認為FALSE
,表示 。 qr.R
-
signature(qr = "sparseQR")
:qrR
返回 、 、 或 ,具體取決於可選參數complete
和backPermute
。兩種情況下的默認值都是FALSE
,表示 ,以與base
兼容。這種情況下結果的類是dtCMatrix
。在其他三種情況下,它是dgCMatrix
。 qr.X
-
signature(qr = "sparseQR")
:默認情況下,將 作為dgeMatrix
返回。如果 和可選參數ncol
大於 ,則結果將用 進行擴充,其中 由 單位矩陣的 到ncol
列組成。 qr.coef
-
signature(qr = "sparseQR", y = .)
:以dgeMatrix
或向量形式返回左側y
乘以 的結果。 qr.fitted
-
signature(qr = "sparseQR", y = .)
:以dgeMatrix
或向量形式返回左側y
乘以 的結果。 qr.resid
-
signature(qr = "sparseQR", y = .)
:以dgeMatrix
或向量形式返回左側y
乘以 的結果。 qr.qty
-
signature(qr = "sparseQR", y = .)
:以dgeMatrix
或向量形式返回左側y
乘以 的結果。 qr.qy
-
signature(qr = "sparseQR", y = .)
:以dgeMatrix
或向量形式返回左側y
乘以 的結果。 solve
-
signature(a = "sparseQR", b = .)
:參見solve-methods
。
例子
showClass("sparseQR")
set.seed(2)
m <- 300L
n <- 60L
A <- rsparsematrix(m, n, 0.05)
## With dimnames, to see that they are propagated :
dimnames(A) <- dn <- list(paste0("r", seq_len(m)),
paste0("c", seq_len(n)))
(qr.A <- qr(A))
str(e.qr.A <- expand2(qr.A, complete = FALSE), max.level = 2L)
str(E.qr.A <- expand2(qr.A, complete = TRUE), max.level = 2L)
t(sapply(e.qr.A, dim))
t(sapply(E.qr.A, dim))
## Horribly inefficient, but instructive :
slowQ <- function(V, beta) {
d <- dim(V)
Q <- diag(d[1L])
if(d[2L] > 0L) {
for(j in d[2L]:1L) {
cat(j, "\n", sep = "")
Q <- Q - (beta[j] * tcrossprod(V[, j])) %*% Q
}
}
Q
}
ae1 <- function(a, b, ...) all.equal(as(a, "matrix"), as(b, "matrix"), ...)
ae2 <- function(a, b, ...) ae1(unname(a), unname(b), ...)
## A ~ P1' Q R P2' ~ P1' Q1 R1 P2' in floating point
stopifnot(exprs = {
identical(names(e.qr.A), c("P1.", "Q1", "R1", "P2."))
identical(names(E.qr.A), c("P1.", "Q" , "R" , "P2."))
identical(e.qr.A[["P1."]],
new("pMatrix", Dim = c(m, m), Dimnames = c(dn[1L], list(NULL)),
margin = 1L, perm = invertPerm(qr.A@p, 0L, 1L)))
identical(e.qr.A[["P2."]],
new("pMatrix", Dim = c(n, n), Dimnames = c(list(NULL), dn[2L]),
margin = 2L, perm = invertPerm(qr.A@q, 0L, 1L)))
identical(e.qr.A[["R1"]], triu(E.qr.A[["R"]][seq_len(n), ]))
identical(e.qr.A[["Q1"]], E.qr.A[["Q"]][, seq_len(n)] )
identical(E.qr.A[["R"]], qr.A@R)
## ae1(E.qr.A[["Q"]], slowQ(qr.A@V, qr.A@beta))
ae1(crossprod(E.qr.A[["Q"]]), diag(m))
ae1(A, with(e.qr.A, P1. %*% Q1 %*% R1 %*% P2.))
ae1(A, with(E.qr.A, P1. %*% Q %*% R %*% P2.))
ae2(A.perm <- A[qr.A@p + 1L, qr.A@q + 1L], with(e.qr.A, Q1 %*% R1))
ae2(A.perm , with(E.qr.A, Q %*% R ))
})
## More identities
b <- rnorm(m)
stopifnot(exprs = {
ae1(qrX <- qr.X (qr.A ), A)
ae2(qrQ <- qr.Q (qr.A ), with(e.qr.A, P1. %*% Q1))
ae2( qr.R (qr.A ), with(e.qr.A, R1))
ae2(qrc <- qr.coef (qr.A, b), with(e.qr.A, solve(R1 %*% P2., t(qrQ)) %*% b))
ae2(qrf <- qr.fitted(qr.A, b), with(e.qr.A, tcrossprod(qrQ) %*% b))
ae2(qrr <- qr.resid (qr.A, b), b - qrf)
ae2(qrq <- qr.qy (qr.A, b), with(E.qr.A, P1. %*% Q %*% b))
ae2(qr.qty(qr.A, qrq), b)
})
## Sparse and dense computations should agree here
qr.Am <- qr(as(A, "matrix")) # <=> qr.default(A)
stopifnot(exprs = {
ae2(qrX, qr.X (qr.Am ))
ae2(qrc, qr.coef (qr.Am, b))
ae2(qrf, qr.fitted(qr.Am, b))
ae2(qrr, qr.resid (qr.Am, b))
})
參考
Davis, T. A. (2006). Direct methods for sparse linear systems. Society for Industrial and Applied Mathematics. doi:10.1137/1.9780898718881
Golub, G. H., & Van Loan, C. F. (2013). Matrix computations (4th ed.). Johns Hopkins University Press. doi:10.56021/9781421407944
也可以看看
來自 base
的通用函數 qr
,其默認方法 qr.default
“defines” 是密集 QR 分解的 S3 類 qr
。
qr-methods
用於 Matrix
中定義的方法。
QR 分解的許多輔助函數: qr.Q
, qr.R
, qr.X
, qr.coef
, qr.fitted
, qr.resid
, qr.qty
, qr.qy
和 qr.solve
。
相關用法
- R sparseMatrix 從非零項構建一般稀疏矩陣
- R sparse.model.matrix 構造稀疏設計/模型矩陣
- R sparseVector-class 稀疏向量類
- R sparseMatrix-class 虛擬類“sparseMatrix”——稀疏矩陣之母
- R sparseLU-class 稀疏 LU 分解
- R sparseVector 從非零條目構造稀疏向量
- R spMatrix 三元組的稀疏矩陣構造函數
- R solve-methods 函數求解矩陣包中的方法
- R symmetricMatrix-class 包矩陣中對稱矩陣的虛擬類
- R symmpart-methods 矩陣的對稱部分和偏斜(對稱)部分
- R dtrMatrix-class 三角形稠密數值矩陣
- R facmul-methods 乘以矩陣因式分解的因數
- R updown-methods 更新和降級稀疏 Cholesky 分解
- R bdiag 構建分塊對角矩陣
- R printSpMatrix 靈活格式化和打印稀疏矩陣
- R all.equal-methods 函數 all.equal() 的矩陣封裝方法
- R boolmatmult-methods 布爾算術矩陣乘積:%&% 和方法
- R ltrMatrix-class 三角密集邏輯矩陣
- R Hilbert 生成希爾伯特矩陣
- R nearPD 最近正定矩陣
- R lsyMatrix-class 對稱密集邏輯矩陣
- R CHMfactor-class 稀疏 Cholesky 分解
- R dgCMatrix-class 壓縮、稀疏、麵向列的數值矩陣
- R Cholesky-methods Cholesky 分解方法
- R Subassign-methods “[<-”的方法 - 分配給“矩陣”的子集
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Sparse QR Factorizations。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。