[R] How to compute eigenvectors and eigenvalues?
Martin Maechler
maechler at stat.math.ethz.ch
Mon Nov 14 13:06:46 CET 2011
> Consider the following matrix:
> > mp <- matrix(c(0,1/4,1/4,3/4,0,1/4,1/4,3/4,1/2),3,3,byrow=T)
> > mp
> [,1] [,2] [,3]
> [1,] 0.00 0.25 0.25
> [2,] 0.75 0.00 0.25
> [3,] 0.25 0.75 0.50
> The eigenvectors of the previous matrix are 1, 0.25 and 0.25 and it is not a diagonalizable matrix.
> When you try to find the eigenvalues and eigenvectors with R, R responses:
> > eigen(mp)
> $values
> [1] 1.00 -0.25 -0.25
> $vectors
> [,1] [,2] [,3]
> [1,] 0.3207501 1.068531e-08 -1.068531e-08
> [2,] 0.4490502 -7.071068e-01 -7.071068e-01
> [3,] 0.8339504 7.071068e-01 7.071068e-01
> The eigenvalues are correct but the eigenvectors aren't.
Well, let's look at 4*mp which is an integer matrix:
> (M <- matrix(c(rep(c(0, 3, 1, 1), 2),2), 3,3)); em <- eigen(M); V <- em$vectors; lam <- em$values
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 3 0 1
[3,] 1 3 2
> all.equal(M, V %*% diag(lam) %*% solve(V))
[1] TRUE
> zapsmall(V %*% diag(lam) %*% solve(V))
[,1] [,2] [,3]
[1,] 0 1 1
[2,] 3 0 1
[3,] 1 3 2
>
So, as you see V is not singular,
and the basic property of the eigenvalue decomposition is
fulfilled:
M = V Lambda V^{-1}
or
M V = V Lambda
i.e. each column of V *is* eigenvector to the corresponding
eigenvalue.
> Moreover, if you try to compute the inverse of the matrix of eigenvectors, R is not aware that this matrix is singular:
> > solve(eigen(mp)$vectors)
> [,1] [,2] [,3]
> [1,] 6.235383e-01 6.235383e-01 6.235383e-01
> [2,] 3.743456e+07 -9.358641e+06 -9.358640e+06
> [3,] -3.743456e+07 9.358640e+06 9.358641e+06
it isn't...
> My question is: how can I fix it?
No need to fix anything, as nothing is broken ;-)
Martin Maechler, ETH Zurich
More information about the R-help
mailing list