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


R solve-methods 函數求解矩陣包中的方法


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

說明

通用函數solve求解線性方程組的方法,即 中的 ,其中 是方陣, 是維度與 一致的矩陣。

用法

solve(a, b, ...)

## S4 method for signature 'dgeMatrix,ANY'
solve(a, b, tol = .Machine$double.eps, ...)

## S4 method for signature 'dgCMatrix,missing'
solve(a, b, sparse = TRUE, ...)
## S4 method for signature 'dgCMatrix,matrix'
solve(a, b, sparse = FALSE, ...)
## S4 method for signature 'dgCMatrix,denseMatrix'
solve(a, b, sparse = FALSE, ...)
## S4 method for signature 'dgCMatrix,sparseMatrix'
solve(a, b, sparse = TRUE, ...)

## S4 method for signature 'denseLU,dgeMatrix'
solve(a, b, ...)
## S4 method for signature 'BunchKaufman,dgeMatrix'
solve(a, b, ...)
## S4 method for signature 'Cholesky,dgeMatrix'
solve(a, b, ...)
## S4 method for signature 'sparseLU,dgCMatrix'
solve(a, b, tol = .Machine$double.eps, ...)
## S4 method for signature 'sparseQR,dgCMatrix'
solve(a, b, ...)
## S4 method for signature 'CHMfactor,dgCMatrix'
solve(a, b, system = c("A", "LDLt", "LD", "DLt", "L", "Lt", "D", "P", "Pt"), ...)

參數

a

包含線性係統係數的 finite 方陣或 Matrix ,或者 MatrixFactorization ,在這種情況下,方法的行為(默認情況下)就像指定了分解矩陣一樣。

b

滿足 NROW(b) == nrow(a) 的向量、 sparseVector 、矩陣或 Matrix ,給出線性係統的右側。向量 b 被視為 length(b) ×1 矩陣。如果 b 丟失,則方法將 b 視為單位矩陣。

tol

非負數。對於繼承自 denseMatrixa,如果 a 的倒數 one-norm 條件數(參見 rcond )小於 tol ,則發出錯誤信號,指示 a 為 near-singular。對於 sparseLU 類的 a,如果比率 min(d)/max(d) 小於 tol(其中 d = abs(diag(a@U))),則會發出錯誤信號。 (請小心解釋,因為該比率是一種廉價的啟發式方法,通常不等於甚至不與 one-norm 條件數的倒數成正比。)設置 tol = 0 將禁用測試。

sparse

指示結果是否應形式稀疏的邏輯,即結果是否應從虛擬類 sparseMatrix 繼承。隻有稀疏 a 和缺失或矩陣 b 的方法才有此參數。缺失或稀疏b 的方法默認使用sparse = TRUE。密集b 的方法默認使用sparse = FALSE

system

指定要求解的線性係統的字符串。隻有從 CHMfactor 繼承的 a 方法才有此參數。查看具體信息'。

...

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

細節

一般矩陣和對稱矩陣 a 的方法計算三角分解(LU、Bunch-Kaufman 或 Cholesky)並調用相應分解類的方法。如果 a 是稀疏的,則因式分解是稀疏的。稀疏對稱矩陣 a 的方法嘗試進行 Cholesky 分解,並且僅在失敗時才執行 LU 分解(通常是因為 a 不是正定的)。

三角形、對角線和置換矩陣不需要因式分解(它們已經是“factors”),因此直接實現這些方法。對於三角形a,通過前向或後向代入得到解;對於對角線 a ,它們是通過縮放 b 的行獲得的;對於排列 a ,它們是通過排列 b 的行獲得的。

密集 a 的方法基於 14 個 LAPACK 例程構建:類 d..Matrix ,其中 ..=(ge|tr|tp|sy|sp|po|pp) 分別使用例程 d..trid..trs 來處理缺失和非缺失的 b 。推論是這些方法總是給出密集的結果。

稀疏 a 的方法基於 CSparse 例程 cs_lsolvecs_usolvecs_spsolve 以及 CHOLMOD 例程 cholmod_solvecholmod_spsolve 構建。默認情況下,如果 b 是向量,這些方法會給出向量結果;如果 b 缺失或稀疏矩陣,這些方法會給出稀疏矩陣結果;如果 b 是稠密矩陣,這些方法會給出稠密矩陣結果。可以通過設置 sparse 參數(如果可用)來覆蓋此行為,但應小心操作。請注意,稀疏結果可能僅在形式意義上是稀疏的,而在數學意義上根本不是稀疏的,具體取決於 ab 的非零模式。此外,雖然密集結果是完全預分配的,但稀疏結果必須是 “grown” 在 b 列上的循環中。

sparseQR 類的 a 的方法是 qr.coef 的簡單包裝,在超定情況下給出最小二乘解。

a 繼承自 CHMfactor 的方法可以解決默認係統 以外的係統。係統實際解決的 system 參數之間的對應關係如下表所示。有關符號的定義,請參閱CHMfactor-class

system isLDL(a)=TRUE isLDL(a)=FALSE
"A"
"LDLt"
"LD"
"DLt"
"L"
"Lt"
"D"
"P"
"Pt"

例子

## A close to symmetric example with "quite sparse" inverse:
n1 <- 7; n2 <- 3
dd <- data.frame(a = gl(n1,n2), b = gl(n2,1,n1*n2))# balanced 2-way
X <- sparse.model.matrix(~ -1+ a + b, dd)# no intercept --> even sparser
XXt <- tcrossprod(X)
diag(XXt) <- rep(c(0,0,1,0), length.out = nrow(XXt))

n <- nrow(ZZ <- kronecker(XXt, Diagonal(x=c(4,1))))
image(a <- 2*Diagonal(n) + ZZ %*% Diagonal(x=c(10, rep(1, n-1))))
isSymmetric(a) # FALSE
image(drop0(skewpart(a)))
image(ia0 <- solve(a, tol = 0)) # checker board, dense [but really, a is singular!]
try(solve(a, sparse=TRUE))##-> error [ TODO: assertError ]
ia. <- solve(a, sparse=TRUE, tol = 1e-19)##-> *no* error
if(R.version$arch == "x86_64")
  ## Fails on 32-bit [Fedora 19, R 3.0.2] from Matrix 1.1-0 on [FIXME ??] only
  stopifnot(all.equal(as.matrix(ia.), as.matrix(ia0)))
a <- a + Diagonal(n)
iad <- solve(a)
ias <- solve(a, sparse=FALSE)
stopifnot(all.equal(as(iad,"denseMatrix"), ias, tolerance=1e-14))
I. <- iad %*% a          ; image(I.)
I0 <- drop0(zapsmall(I.)); image(I0)
.I <- a %*% iad
.I0 <- drop0(zapsmall(.I))
stopifnot( all.equal(as(I0, "diagonalMatrix"), Diagonal(n)),
           all.equal(as(.I0,"diagonalMatrix"), Diagonal(n)) )

也可以看看

虛擬類MatrixFactorization 及其子類。

用於計算因式分解的通用函數 CholeskyBunchKaufmanSchurluqr

base 中的通用函數 solve

base 中的函數 qr.coef 用於計算超定線性係統的最小二乘解。

相關用法


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