Learn R Programming

Matrix (version 1.7-4)

condest: Compute Approximate CONDition number and 1-Norm of (Large) Matrices

Description

“Estimate”, i.e. compute approximately the CONDition number of a (potentially large, often sparse) matrix A. It works by apply a fast randomized approximation of the 1-norm, norm(A,"1"), through onenormest(.).

Usage

condest(A, t = min(n, 5), normA = norm(A, "1"),
        silent = FALSE, quiet = TRUE)

onenormest(A, t = min(n, 5), A.x, At.x, n, silent = FALSE, quiet = silent, iter.max = 10, eps = 4 * .Machine$double.eps)

Arguments

Value

Both functions return a list;

condest() with components,

est

a number \(> 0\), the estimated (1-norm) condition number \(\hat\kappa\); when \(r :=\)rcond(A), \(1/\hat\kappa \approx r\).

v

the maximal \(A x\) column, scaled to norm(v) = 1. Consequently, \(norm(A v) = norm(A) / est\); when est is large, v is an approximate null vector.

The function onenormest() returns a list with components,

est

a number \(> 0\), the estimated norm(A, "1").

v

0-1 integer vector length n, with an 1 at the index j with maximal column A[,j] in \(A\).

w

numeric vector, the largest \(A x\) found.

iter

the number of iterations used.

Details

condest() calls lu(A), and subsequently onenormest(A.x = , At.x = ) to compute an approximate norm of the inverse of A, \(A^{-1}\), in a way which keeps using sparse matrices efficiently when A is sparse.

Note that onenormest() uses random vectors and hence both functions' results are random, i.e., depend on the random seed, see, e.g., set.seed().

References

Nicholas J. Higham and Françoise Tisseur (2000). A Block Algorithm for Matrix 1-Norm Estimation, with an Application to 1-Norm Pseudospectra. SIAM J. Matrix Anal. Appl. 21, 4, 1185--1201.

William W. Hager (1984). Condition Estimates. SIAM J. Sci. Stat. Comput. 5, 311--316.

See Also

Examples

Run this code
 
library(utils, pos = "package:base", verbose = FALSE)

data(KNex, package = "Matrix")
mtm <- with(KNex, crossprod(mm))
system.time(ce <- condest(mtm))
sum(abs(ce$v)) ## || v ||_1  == 1
## Prove that  || A v || = || A || / est  (as ||v|| = 1):
stopifnot(all.equal(norm(mtm %*% ce$v),
                    norm(mtm) / ce$est))

## reciprocal
1 / ce$est
system.time(rc <- rcond(mtm)) # takes ca  3 x  longer
rc
all.equal(rc, 1/ce$est) # TRUE -- the approximation was good

one <- onenormest(mtm)
str(one) ## est = 12.3
## the maximal column:
which(one$v == 1) # mostly 4, rarely 1, depending on random seed

Run the code above in your browser using DataLab