qr-methods
位於 Matrix
包(package)。 說明
計算 實數矩陣 的旋轉 QR 分解,其具有一般形式
或(等效地)
其中 和 是置換矩陣, 是 正交矩陣,等於 Householder 矩陣 的乘積, 是 上陷阱矩狀矩陣。
denseMatrix
使用 base
中實現的默認方法,即 qr.default
。它基於 LINPACK 例程 dqrdc
和 LAPACK 例程 dgeqp3
構建,它們不進行行旋轉,因此 是單位矩陣。
sparseMatrix
的方法基於 CSparse 例程 cs_sqr
和 cs_qr
構建,需要 。
用法
qr(x, ...)
## S4 method for signature 'dgCMatrix'
qr(x, order = 3L, ...)
參數
x |
|
order |
|
... |
傳入或傳出方法的更多參數。 |
細節
如果 x
稀疏且結構秩不足,具有結構秩 ,則用 行(部分非結構性)零來增強 x
,使得增強矩陣具有結構秩 。該增廣矩陣按如上所述進行因式分解:
其中 表示用戶提供的原始 矩陣。
值
表示因式分解的對象,繼承自虛擬 S4 類 QR
或 S3 類 qr
。特定類是 qr
,除非 x
繼承自虛擬類 sparseMatrix
,在這種情況下它是 sparseQR
。
例子
showMethods("qr", inherited = FALSE)
## Rank deficient: columns 3 {b2} and 6 {c3} are "extra"
M <- as(cbind(a1 = 1,
b1 = rep(c(1, 0), each = 3L),
b2 = rep(c(0, 1), each = 3L),
c1 = rep(c(1, 0, 0), 2L),
c2 = rep(c(0, 1, 0), 2L),
c3 = rep(c(0, 0, 1), 2L)),
"CsparseMatrix")
rownames(M) <- paste0("r", seq_len(nrow(M)))
b <- 1:6
eps <- .Machine$double.eps
## .... [1] full rank ..................................................
## ===> a least squares solution of A x = b exists
## and is unique _in exact arithmetic_
(A1 <- M[, -c(3L, 6L)])
(qr.A1 <- qr(A1))
stopifnot(exprs = {
rankMatrix(A1) == ncol(A1)
{ d1 <- diag(qr.A1@R); sum(d1 < max(d1) * eps) == 0L }
rcond(crossprod(A1)) >= eps
all.equal(qr.coef(qr.A1, b), drop(solve(crossprod(A1), crossprod(A1, b))))
all.equal(qr.fitted(qr.A1, b) + qr.resid(qr.A1, b), b)
})
## .... [2] numerically rank deficient with full structural rank .......
## ===> a least squares solution of A x = b does not
## exist or is not unique _in exact arithmetic_
(A2 <- M)
(qr.A2 <- qr(A2))
stopifnot(exprs = {
rankMatrix(A2) == ncol(A2) - 2L
{ d2 <- diag(qr.A2@R); sum(d2 < max(d2) * eps) == 2L }
rcond(crossprod(A2)) < eps
## 'qr.coef' computes unique least squares solution of "nearby" problem
## Z x = b for some full rank Z ~ A, currently without warning {FIXME} !
tryCatch({ qr.coef(qr.A2, b); TRUE }, condition = function(x) FALSE)
all.equal(qr.fitted(qr.A2, b) + qr.resid(qr.A2, b), b)
})
## .... [3] numerically and structurally rank deficient ................
## ===> factorization of _augmented_ matrix with
## full structural rank proceeds as in [2]
## NB: implementation details are subject to change; see (*) below
A3 <- M
A3[, c(3L, 6L)] <- 0
A3
(qr.A3 <- qr(A3)) # with a warning ... "additional 2 row(s) of zeros"
stopifnot(exprs = {
## sparseQR object preserves the unaugmented dimensions (*)
dim(qr.A3 ) == dim(A3)
dim(qr.A3@V) == dim(A3) + c(2L, 0L)
dim(qr.A3@R) == dim(A3) + c(2L, 0L)
## The augmented matrix remains numerically rank deficient
rankMatrix(A3) == ncol(A3) - 2L
{ d3 <- diag(qr.A3@R); sum(d3 < max(d3) * eps) == 2L }
rcond(crossprod(A3)) < eps
})
## Auxiliary functions accept and return a vector or matrix
## with dimensions corresponding to the unaugmented matrix (*),
## in all cases with a warning
qr.coef (qr.A3, b)
qr.fitted(qr.A3, b)
qr.resid (qr.A3, b)
## .... [4] yet more examples ..........................................
## By disabling column pivoting, one gets the "vanilla" factorization
## A = Q~ R, where Q~ := P1' Q is orthogonal because P1 and Q are
(qr.A1.pp <- qr(A1, order = 0L)) # partial pivoting
ae1 <- function(a, b, ...) all.equal(as(a, "matrix"), as(b, "matrix"), ...)
ae2 <- function(a, b, ...) ae1(unname(a), unname(b), ...)
stopifnot(exprs = {
length(qr.A1 @q) == ncol(A1)
length(qr.A1.pp@q) == 0L # indicating no column pivoting
ae2(A1[, qr.A1@q + 1L], qr.Q(qr.A1 ) %*% qr.R(qr.A1 ))
ae2(A1 , qr.Q(qr.A1.pp) %*% qr.R(qr.A1.pp))
})
參考
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
也可以看看
類sparseQR
及其方法。
來自 base
的通用函數 qr
,其默認方法 qr.default
“defines” 是密集 QR 分解的 S3 類 qr
。
通用函數 expand1
和 expand2
,用於根據結果構造矩陣因子。
通用函數 Cholesky
、 BunchKaufman
、 Schur
和 lu
用於計算其他因式分解。
相關用法
- 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 CHMfactor-class 稀疏 Cholesky 分解
- R symmpart-methods 矩陣的對稱部分和偏斜(對稱)部分
- R sparseMatrix 從非零項構建一般稀疏矩陣
- R dgCMatrix-class 壓縮、稀疏、麵向列的數值矩陣
- R Cholesky-methods Cholesky 分解方法
- R Subassign-methods “[<-”的方法 - 分配給“矩陣”的子集
- R ldenseMatrix-class 密集邏輯矩陣的虛擬類“ldenseMatrix”
- R norm-methods 矩陣範數
- R ngeMatrix-class 一般密集非零模式矩陣的“ngeMatrix”類
- R CAex 阿爾伯斯的示例矩陣與“困難”特征分解
- R diagonalMatrix-class 對角矩陣的“diagonalMatrix”類
- R matmult-methods 矩陣(叉)積(轉置)
注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Methods for QR Factorization。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。