pseudoinverse {GeneTS}R Documentation

Pseudoinverse of a Matrix

Description

The standard definition for the inverse of a matrix fails if the matrix is not square or singular. However, one can generalize the inverse using singular value decomposition. Any rectangular real matrix M can be decomposed as

M = U diag(D[i] V',

where U and V are orthogonal, V' means V transposed, and D is a diagonal matrix with the singular values (see svd). The pseudoinverse (also known as Moore­Penrose inverse) is then obtained as

IM = V diag(1/D[i]) U' .

If the matrix M is singular or ill-conditioned the inverse is approximated by setting 1/D[i] <- 0 for small singular values (D[i] <= tol*max(D)). The pseudoinverse has the property that the sum of the squares of all the entries in (IM %*% M - I), where I is an appropriate identity matrix, is minimized. For non-singular matrices the pseudoinverse is equivalent to the standard inverse.

Usage

pseudoinverse(m, tol = sqrt(.Machine$double.eps))

Arguments

m matrix
tol tolerance - singular values larger than tol times the maximum singular value are considered non-zero

Value

A matrix (the pseudoinverse of m).

Author(s)

Korbinian Strimmer (http://www.stat.uni-muenchen.de/~strimmer/).

See Also

svd, solve, ginv.

Examples

# load GeneTS library
library(GeneTS)

# a singular matrix
m <- rbind(
c(1,2),
c(1,2)
)

# not possible to invert exactly
try(solve(m))

# pseudoinverse
p <- pseudoinverse(m)
p

# characteristics of the pseudoinverse
zapsmall( m %*% p %*% m )  ==  zapsmall( m )
zapsmall( p %*% m %*% p )  ==  zapsmall( p )
zapsmall( p %*% m )  ==  zapsmall( t(p %*% m ) )
zapsmall( m %*% p )  ==  zapsmall( t(m %*% p ) )

# example with an invertable matrix
m2 <- rbind(
c(1,1),
c(1,0)
)
zapsmall( solve(m2) ) == zapsmall( pseudoinverse(m2) )

[Package Contents]