当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。