當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


R qr-methods QR 分解方法


R語言 qr-methods 位於 Matrix 包(package)。

說明

計算 實數矩陣 的旋轉 QR 分解,其具有一般形式

或(等效地)

其中 是置換矩陣, 正交矩陣,等於 Householder 矩陣 的乘積, 上陷阱矩狀矩陣。

denseMatrix 使用 base 中實現的默認方法,即 qr.default 。它基於 LINPACK 例程 dqrdc 和 LAPACK 例程 dgeqp3 構建,它們不進行行旋轉,因此 是單位矩陣。

sparseMatrix 的方法基於 CSparse 例程 cs_sqrcs_qr 構建,需要

用法

qr(x, ...)
## S4 method for signature 'dgCMatrix'
qr(x, order = 3L, ...)

參數

x

要分解的 finite 矩陣或 Matrix,如果稀疏,則滿足 nrow(x) >= ncol(x)

order

0:3 中的整數傳遞給 CSparse 例程 cs_sqr ,指示選擇列排列 的策略。 0 表示沒有列排列。圖 1、2 和 3 表示 的 fill-reducing 排序,其中 是刪除了 “dense” 行的 。除非您知道 的列順序已經合理,否則請勿設置為 0。

...

傳入或傳出方法的更多參數。

細節

如果 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 及其方法。

dgCMatrix

來自 base 的通用函數 qr ,其默認方法 qr.default “defines” 是密集 QR 分解的 S3 類 qr

通用函數 expand1expand2 ,用於根據結果構造矩陣因子。

通用函數 CholeskyBunchKaufmanSchurlu 用於計算其他因式分解。

相關用法


注:本文由純淨天空篩選整理自R-devel大神的英文原創作品 Methods for QR Factorization。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。