expmat: Exponentiation of a matrix

View source: R/expmat.R

expmatR Documentation

Exponentiation of a matrix

Description

The expmat function performs can calculate the pseudoinverse (i.e. "Moore-Penrose pseudoinverse") of a matrix (EXP=-1) and other exponents of matrices, such as square roots (EXP=0.5) or square root of its inverse (EXP=-0.5). The function arguments are a matrix (MAT), an exponent (EXP), and a tolerance level for non-zero singular values. The function follows three steps: 1) Singular Value Decomposition (SVD) of the matrix; 2) Exponentiation of the singular values; 3) Re-calculation of the matrix with the new singular values

Usage

expmat(MAT, EXP = -1, tol = NULL)

Arguments

MAT

A matrix.

EXP

An exponent to apply to the matrix MAT. Default = -1

tol

Tolerance level for non-zero singular values.

Value

A matrix

Examples

# Example matrix from Wilks (2006)
A <- matrix(c(185.47,110.84,110.84,77.58),2,2)
A
solve(A) #inverse
expmat(A, -1) # pseudoinverse
expmat(expmat(A, -1), -1) #inverse of the inverse -return to original A matrix
expmat(A, 0.5) # square root of a matrix
expmat(A, -0.5) # square root of its inverse
expmat(expmat(A, -1), 0.5) # square root of its inverse (same as above)

# Pseudoinversion of a non-square matrix
set.seed(1)
D <- matrix(round(runif(24, min=1, max=100)), 4, 6)
D
expmat(D, -1)
expmat(t(D), -1)

# Pseudoinversion of a square matrix
set.seed(1)
D <- matrix(round(runif(25, min=1, max=100)), 5, 5)
solve(D)
expmat(D, -1)
solve(t(D))
expmat(t(D), -1)

### Examples from "corpcor" package manual
# a singular matrix
m = rbind(
  c(1,2),
  c(1,2)
)

# not possible to invert exactly
# solve(m) # produces an error
p <- expmat(m, -1)

# 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( expmat(m2,-1) )


marchtaylor/sinkr documentation built on July 4, 2022, 5:48 p.m.