Miguel Lacerda
2010-Jul-17 15:46 UTC
[R] Computing the power of a matrix efficiently and accurately
Good day,
I would like to know if there is an efficient and accurate method for
computing the power of a tridiagonal matrix in R? The "obvious" method
would
be eigen-decomposition, but I find that this is not very accurate, probably
because the dimensions of the matrix I am considering are large and the
eigenvectors are not well approximated. Here is an example of what I am
trying to do:
set.seed(1234)
m=500 # dimension of my matrix
X=diag(rnorm(500,20,2)) # set up tridiagonal matrix
for(i in 1:(m-1))
{
X[i,i+1]=rnorm(1,5,1)
X[i+1,i]=rnorm(1,5,1)
}
n=100 # the power of the matrix X i.e. X^n = X%*%X%*%X ... n times (n = 1000
in my application)
X_eigen=eigen(X)
P=X_eigen$vectors
P_inv=solve(P)
d=X_eigen$values
M=diag(m)
res_mult=c()
res_eigen=c()
for(i in 1:n)
{
# straightforward multiplication...
M = M%*%X
res_mult = rbind(res_mult, M[m,])
# eigen-decomposition...
res_eigen = rbind(res_eigen, (P%*%diag(d^i)%*%P_inv)[m,])
}
# Look how the diagonal element X[m,m] changes with successive
powers:> res_mult[1,m]
[1] 23.45616> res_eigen[1,m]
[1] 23.45616> res_mult[n,m]
[1] 3.844556e+148> res_eigen[n,m]
[1] 3.844556e+148
# Look how the off-diagonal element X[m,1] changes with successive
powers:> res_mult[1,1]
[1] 0> res_eigen[1,1]
[1] 1.942362e-16> res_mult[n,1]
[1] 0> res_eigen[n,1]
[1] 1.469650e+132
Notice how poorly the off-diagonal element is approximated by the
eigen-decomposition!! I am aware of the mtx.exp() function in the Malmig
package, although repeatedly calling this function is not efficient as I
need to extract the m-th row of the matrix raised to each power from 1:n.
Any suggestions? Could I possibly exploit the fact that X is tridiagonal in
my application?
Thanks!
Miguel
--
Miguel Lacerda
Department of Statistical Sciences
University of Cape Town
[[alternative HTML version deleted]]
