MPinv {gnm}R Documentation

Moore-Penrose Pseudoinverse of a Real-valued Matrix

Description

Computes the Moore-Penrose generalized inverse, optionally using a method (appropriate for symmetric matrices only) which exploits the direct inversion of a diagonal submatrix if such exists.

Usage

MPinv(mat, eliminate = numeric(0), onlyFirstCol = FALSE,
      onlyNonElim = FALSE, tolerance = 100*.Machine$double.eps)

Arguments

mat A real matrix, which should be symmetric unless eliminate has zero length.
eliminate Numeric. A vector of indices identifying rows/columns which form a diagonal submatrix of mat.
onlyFirstCol Logical. If TRUE, return only the first column of the generalized inverse matrix; otherwise the whole matrix.
onlyNonElim Logical. If TRUE, return only rows/columns that are in the complement of the set specified in eliminate.
tolerance A positive scalar which determines the tolerance for detecting zeroes among the singular values.

Details

Real-valuedness is not checked, and neither is symmetry or the diagonality of the submatrix when eliminate is used.

The purpose of the eliminate argument is a substantial reduction of the computational burden when the number of `eliminated' rows/columns is large.

Value

A matrix, with an additional attribute named "rank" containing the numerically determined rank of the matrix.

Author(s)

David Firth

References

Harville, D. A. (1997). Matrix Algebra from a Statistician's Perspective. New York: Springer.

See Also

ginv

Examples

A <- matrix(c(1, 1, 0,
              1, 1, 0,
              2, 3, 4), 3, 3)
B <- MPinv(A)
A %*% B %*% A - A  # essentially zero
B %*% A %*% B - B  # essentially zero
attr(B, "rank")    # here 2

## now a symmetric example with diagonal submatrix to `eliminate'
A <- matrix(c(1, 0, 2,
              0, 2, 3,
              2, 3, 4), 3, 3)
B <- MPinv(A, eliminate = 1:2)
A %*% B %*% A - A  # essentially zero
B %*% A %*% B - B  # essentially zero
attr(B, "rank")        # here 3

## Not run: 
## demo that eliminate can give substantial speed gains
A <- diag(rnorm(100))
A <- cbind(A, matrix(rnorm(200), 100, 2))
A <- rbind(A, cbind(t(A[, 101:102]), matrix(c(1, 2, 2, 1), 2, 2)))
system.time(for (i in 1:1000) B <-  MPinv(A))
##  [1] 26.83 10.24 39.76  0.00  0.00
system.time(for (i in 1:1000) B <-  MPinv(A, eliminate = 1:100))
##  [1] 3.49 1.37 5.04 0.00 0.00
## End(Not run)

[Package gnm version 0.6-1 Index]