spam-solve {spam} | R Documentation |
Linear Equation Solving for Sparse Matrices
Description
backsolve
and forwardsolve
solve a system
of linear equations where the coefficient matrix
is upper or lower triangular.
solve
solves a linear system or computes the inverse
of a matrix if the right-hand-side is missing.
Usage
## S4 method for signature 'spam'
solve(a, b, Rstruct=NULL, ...)
## S4 method for signature 'spam'
backsolve(r, x, ...)
## S4 method for signature 'spam'
forwardsolve(l, x, ...)
## S4 method for signature 'spam'
chol2inv(x, ...)
Arguments
a |
symmetric positive definite matrix of class |
l , r |
object of class |
x , b |
vector or regular matrix of right-hand-side(s) of a system of linear equations. |
Rstruct |
the Cholesky structure of |
... |
further arguments passed to or from other methods, see ‘Details’ below. |
Details
We can solve A %*% x = b
by first computing the Cholesky decomposition A =
t(R)%*%R)
, then solving t(R)%*%y = b
for y
, and
finally solving R%*%x = y
for x
.
solve
combines chol
, a Cholesky decomposition of a
symmetric positive definite sparse matrix, with forwardsolve
and
then backsolve
.
In case a
is from a chol
call, then solve
is an
efficient way to calculate backsolve(a, forwardsolve( t(a), b))
.
However, for a.spam
and a.mat
from a chol
call
with a sparse and ordinary matrix, note that
forwardsolve( a.mat, b, transpose=T, upper.tri=T)
is equivalent to
forwardsolve( t(a.mat), b)
and backsolve(a.spam, forwardsolve(a.spam, b, transpose=T, upper.tri=T))
yields the desired result. But
backsolve(a.spam,forwardsolve(t(a.spam), resid))
is
wrong because t(a.spam)
is a spam
and not a
spam.chol.NgPeyton
object.
forwardsolve
and backsolve
solve a system of linear
equations where the coefficient matrix is lower (forwardsolve
) or
upper (backsolve
) triangular. Usually, the triangular matrix is
result from a chol
call and it is not required to transpose it
for forwardsolve
. Note that arguments of the default
methods k
, upper.tri
and transpose
do not have any
effects here.
Notice that it is more efficient to solve successively the linear equations (both triangular solves) than to implement these in the Fortran code.
If the right-hand-side in solve
is missing it will compute
the inverse of a matrix. For details about the specific Cholsesky
decomposition, see chol
.
Recall that the Cholesky factors are from ordered matrices.
chol2inv(x)
is a faster way to solve(x)
.
Note
There is intentionally no S3 distinction between the classes
spam
and spam.chol.
method.
Author(s)
Reinhard Furrer, based on Ng and Peyton (1993) Fortran routines
References
See references in chol
.
See Also
Examples
# Generate multivariate form a covariance inverse:
# (usefull for GRMF)
set.seed(13)
n <- 25 # dimension
N <- 1000 # sample size
Sigmainv <- .25^abs(outer(1:n,1:n,"-"))
Sigmainv <- as.spam( Sigmainv, eps=1e-4)
Sigma <- solve( Sigmainv) # for verification
iidsample <- array(rnorm(N*n),c(n,N))
mvsample <- backsolve( chol(Sigmainv), iidsample)
norm( var(t(mvsample)) - Sigma)
# compare with:
mvsample <- backsolve( chol(as.matrix( Sigmainv)), iidsample, n)
#### ,n as patch
norm( var(t(mvsample)) - Sigma)
# 'solve' step by step:
b <- rnorm( n)
R <- chol(Sigmainv)
norm( backsolve( R, forwardsolve( R, b))-
solve( Sigmainv, b) )
norm( backsolve( R, forwardsolve( R, diag(n)))- Sigma )
# 'update':
R1 <- update( R, Sigmainv + diag.spam( n))