| cgsolve | R Documentation |
cgsolve uses a conjugate gradient algorithm to solve the linear
system A x = b where A is a symmetric matrix. cgsolve is
used internally in lfe in the routines fevcov() and
bccorr(), but has been made public because it might be useful
for other purposes as well.
cgsolve(A, b, eps = 0.001, init = NULL, symmtest = FALSE, name = "")
A |
matrix, Matrix or function. |
b |
vector or matrix of columns vectors. |
eps |
numeric. Tolerance. |
init |
numeric. Initial guess. |
symmtest |
logical. Should the matrix be tested for symmetry? |
name |
character. Arbitrary name used in progress reports. |
The argument A can be a symmetric matrix or a symmetric sparse matrix
inheriting from "Matrix" of the package Matrix. It can also be
a function which performs the matrix-vector product. If so, the function
must be able to take as input a matrix of column vectors.
If the matrix A is rank deficient, some solution is returned. If
there is no solution, a vector is returned which may or may not be close to
a solution. If symmtest is FALSE, no check is performed that
A is symmetric. If not symmetric, cgsolve is likely to raise
an error about divergence.
The tolerance eps is a relative tolerance, i.e. ||x - x_0|| <
\epsilon ||x_0|| where x_0 is the true solution and x is the
solution returned by cgsolve. Use a negative eps for absolute
tolerance. The termination criterion for cgsolve is the one from
Kaasschieter (1988), Algorithm 3.
Preconditioning is currently not supported.
If A is a function, the test for symmetry is performed by drawing two
random vectors x,y, and testing whether |(Ax, y) - (x, Ay)| <
10^{-6} sqrt((||Ax||^2 + ||Ay||^2)/N), where N is the vector length.
Thus, the test is neither deterministic nor perfect.
A solution x of the linear system A x = b is returned.
Kaasschieter, E. (1988) A practical termination criterion for the conjugate gradient method, BIT Numerical Mathematics, 28(2):308-322. https://link.springer.com/article/10.1007/BF01934094
kaczmarz()
N <- 100000
# create some factors
f1 <- factor(sample(34000, N, replace = TRUE))
f2 <- factor(sample(25000, N, replace = TRUE))
# a matrix of dummies, which probably is rank deficient
B <- makeDmatrix(list(f1, f2))
dim(B)
# create a right hand side
b <- as.matrix(B %*% rnorm(ncol(B)))
# solve B' B x = B' b
sol <- cgsolve(crossprod(B), crossprod(B, b), eps = -1e-2)
# verify solution
sqrt(sum((B %*% sol - b)^2))
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.