# Are eigenvectors of real symmetric or hermitian matrix computed from \`eigen\` all orthogonal

**URL:** <https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893>\
**Category:** General Usage\
**Tags:** package, linearalgebra\
**Created:** [May 10, 2021, 2:49pm UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893 "2021-05-10T14:49:21Z")\
**Posts on this page:** 9\
**Page:** 2

<div class="post-metadata">

**Author:** ![ZhiyuanYao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zhiyuanyao/32/15488_2.png) [@ZhiyuanYao](https://discourse.julialang.org/u/ZhiyuanYao)\
**Post date:** [May 11, 2021, 5:55am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/21 "2021-05-11T05:55:01Z")

</div>

> [@antoine-levitt](#):
>
> As far as I know `eigen` checks if the matrix is hermitian up to machine precision and dispatches to the appropriate routine.

I’m not sure whether `eigen` will do the check and dispatch appropriate method. Here is a test,

```julia
julia> a = rand(200, 200); A = a + transpose(a); issymmetric(A)
true

julia> @code_llvm eigen(A)

; @ /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/eigen.jl:234 within `eigen'
define nonnull %jl_value_t* @japi1_eigen_957(%jl_value_t*, %jl_value_t**, i32) #0 {
top:
  %3 = alloca %jl_value_t**, align 8
  store volatile %jl_value_t **%1, %jl_value_t*** %3, align 8
  %4 = load %jl_value_t*, %jl_value_t** %1, align 8
; @ /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.5/LinearAlgebra/src/eigen.jl:235 within `eigen'
  %5 = call nonnull %jl_value_t* @"j_#eigen#69_958"(i8 1, i8 1, %jl_value_t* nonnull %4)
  ret %jl_value_t* %5
}

```

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [May 11, 2021, 6:01am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/22 "2021-05-11T06:01:01Z")

</div>

You have to follow the call chain

---

<div class="post-metadata">

**Author:** ![ZhiyuanYao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zhiyuanyao/32/15488_2.png) [@ZhiyuanYao](https://discourse.julialang.org/u/ZhiyuanYao)\
**Post date:** [May 11, 2021, 6:06am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/23 "2021-05-11T06:06:03Z")

</div>

Agree. I opened the source `eigen.jl` and relevant lines starting from line 234 are

```julia
function eigen(A::AbstractMatrix{T}; permute::Bool=true, scale::Bool=true, sortby::Union{Function,Nothing}=eigsortby) where T
    AA = copy_oftype(A, eigtype(T))
    isdiag(AA) && return eigen(Diagonal(AA); permute=permute, scale=scale, sortby=sortby)
    return eigen!(AA; permute=permute, scale=scale, sortby=sortby)
end

```

It seems that symmetric diagonalization method is not dispatched.

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [May 11, 2021, 6:22am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/24 "2021-05-11T06:22:02Z")

</div>

Go down the rabbit hole again until the eventual blas call

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [May 11, 2021, 6:53am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/25 "2021-05-11T06:53:02Z")

</div>

In particular, in `eigen!` there is:

```julia
    issymmetric(A) && return eigen!(Symmetric(A), sortby=sortby)

```

---

<div class="post-metadata">

**Author:** ![ZhiyuanYao](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/zhiyuanyao/32/15488_2.png) [@ZhiyuanYao](https://discourse.julialang.org/u/ZhiyuanYao)\
**Post date:** [May 11, 2021, 7:31am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/26 "2021-05-11T07:31:28Z")

</div>

Great! I’m convinced.

---

<div class="post-metadata">

**Author:** ![antoine-levitt](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/antoine-levitt/32/4008_2.png) [@antoine-levitt](https://discourse.julialang.org/u/antoine-levitt)\
**Post date:** [May 11, 2021, 8:27am UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/27 "2021-05-11T08:27:42Z")

</div>

Btw that check is exact, ie any arithmetic error will result in the non-symmetric routine being called

---

<div class="post-metadata">

**Author:** ![PetrKryslUCSD](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/petrkryslucsd/32/215825_2.png) [@PetrKryslUCSD](https://discourse.julialang.org/u/PetrKryslUCSD)\
**Post date:** [July 5, 2021, 11:33pm UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/28 "2021-07-05T23:33:04Z")

</div>

As far as I can tell, the guts of eigs in matlab are still Arpack.

---

<div class="post-metadata">

**Author:** ![Dandan](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/dandan/32/8935_2.png) [@Dandan](https://discourse.julialang.org/u/Dandan)\
**Post date:** [February 2, 2022, 3:23pm UTC](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893/29 "2022-02-02T15:23:41Z")

</div>

Is there a dedicated way to obtain orthogonal eigenvectors of a normal matrix?  
Currently, I use this easy trick.

```julia
function eigvecs2(M) 
  r=1.0+im+rand()+im*rand()
  return eigvecs(Hermitian(r'*M + r*M'))
end

```

[Previous page](https://discourse.julialang.org/t/are-eigenvectors-of-real-symmetric-or-hermitian-matrix-computed-from-eigen-all-orthogonal/60893.md?page=1)
