# R basic function eigen has problem with symmetric matrices [closed]

Solution for R basic function eigen has problem with symmetric matrices [closed]
is Given Below:

`eigen` is a base R function that returns eigenvectors and eigenvalues for a given matrix.
I just found that it can be not robust for the symmetric matrices when you specify this explicitly using `symmetric=TRUE`. I show the issue below. Are there libraries that fix the issue and find correct eigenvectors using information about symmetry?

## Example

Let us firstly find an eigen vector for a symmetric matrix without specifying the symmetry.

``````set.seed(1)
I = 10; A = matrix( rnorm(I*I), ncol = I );
## make the matrix symmetric
A[lower.tri(A)] = A[upper.tri(A)]
ev = eigen(A, symmetric=F); ve = ev\$vectors; va = ev\$values;
``````

Test the result taking the difference between A applied to its eigenvector and eigenvector scaled by the eigenvalue. That must be a zero vector. Hence, the sum of its elements must be zero:

``````sum(A %*% ve[,1] - va[1]*ve[,1] )

-3.663736e-15+0i
``````

Now, let’s do the same specifying symmetry:

``````ev = eigen(A, symmetric=TRUE); ve = ev\$vectors; va = ev\$values;
sum(A %*% ve[,1] - va[1]*ve[,1] )

-0.3534416
``````

As it was mentioned in the answers, my example was bad since the matrix was not symmetric. The approach I used for the example

``````A[lower.tri(A)] = A[upper.tri(A)]
``````

will actually give an asymmetric matrix. The more accurate way of getting a symmetric matrix would be

``````A[lower.tri(A)] = t(A)[lower.tri(A)]
``````

or

``````A <- A+t(A)
``````

The example matrix was not made symmetric. Try the following:

``````set.seed(1)
I = 10; A = matrix(rnorm(I*I), ncol = I)

## original posters attempt
A1 <- A
A1[lower.tri(A1)] = A1[upper.tri(A1)]
isSymmetric(A1)
# [1] FALSE

## solution
ndx <- lower.tri(A)
A[ndx] <- t(A)[ndx]
isSymmetric(A)
# [1] TRUE

#ev = eigen(A, symmetric=FALSE); ve = ev\$vectors; va = ev\$values

ev = eigen(A, symmetric=TRUE); ve = ev\$vectors; va = ev\$values
sum(A %*% ve[,1] - va[1]*ve[,1])
# [1] -2.63678e-15
``````

If we prend our matrix wasn’t symmetric, R seems to use another algorithm resulting in a different output order but the eigen values are the same.

``````#?eigen

# random matrix
set.seed(1)
n = 3;
A = matrix(rnorm(n*n), ncol = n, nrow = n)
A[lower.tri(A)] = t(A)[lower.tri(A)]

cat("symmetric matrix An")
A

cat("nsymmetric = FALSEn")
eig1 = eigen(A, symmetric = FALSE)
eig1\$vectors
eig1\$values
prod(eig1\$values)

cat("nsymmetric = TRUEn")
eig2 = eigen(A, symmetric = TRUE)
eig2\$vectors
eig2\$values
prod(eig2\$values)

cat("nsymmetric = ...n")
eig3 = eigen(A)
eig3\$vectors
eig3\$values
prod(eig3\$values)
``````