# MPinv: Moore-Penrose Pseudoinverse of a Real-valued Matrix In gnm: Generalized Nonlinear Models

## Description

Computes the Moore-Penrose generalized inverse.

## Usage

 ```1 2``` ```MPinv(mat, tolerance = 100*.Machine\$double.eps, rank = NULL, method = "svd") ```

## Arguments

 `mat` a real matrix. `tolerance` A positive scalar which determines the tolerance for detecting zeroes among the singular values. `rank` Either `NULL`, in which case the rank of `mat` is determined numerically; or an integer specifying the rank of `mat` if it is known. No check is made on the validity of any non-`NULL` value. `method` Character, one of `"svd", "chol"`. The specification `method = "chol"` is valid only for symmetric matrices.

## Details

Real-valuedness is not checked, neither is symmetry when ```method = "chol"```.

## Value

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

## Author(s)

David Firth and Heather Turner

## References

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

Courrieu, P. (2005). Fast computation of Moore-Penrose inverse matrices. Neural Information Processing 8, 25–29

`ginv`
 ``` 1 2 3 4 5 6 7 8 9 10 11 12``` ```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 ## demonstration that "svd" and "chol" deliver essentially the same ## results for symmetric matrices: A <- crossprod(A) MPinv(A) - MPinv(A, method = "chol") ## (essentially zero) ```