# Julia thinks inverse of a Hermitian matrix is not Hermitian

**URL:** <https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443>\
**Category:** General Usage\
**Created:** [June 10, 2024, 8:12pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443 "2024-06-10T20:12:48Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![archisman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/archisman/32/51867_2.png) [@archisman](https://discourse.julialang.org/u/archisman)\
**Post date:** [June 10, 2024, 8:12pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443/1 "2024-06-10T20:12:48Z")

</div>

Here is my code:

```julia
using LinearAlgebra

a = randn(50,50);
a = (a+a')/2;
println(ishermitian(a))
println(ishermitian(inv(a)))

```

The output is

```julia
True
False

```

However, the inverse of a Hermitian matrix is supposed to be Hermitian.

Turns out that the non-Hermitian part of `inv(a)` is small, so this is a machine precision error. The number `maximum(abs.(inv(a)-inv(a)'))` is \sim10^{-14}.

I am using inverse of a particular Hermitian matrix to generate a quantum Hamiltonian, and it needs to be Hermitian. As a check, I am verifying the Hamiltonian is hermitian before running the code.

However, due to the numerical error I mentioned above, there is no way to distinguish between non-hermiticity generated by machine precision errors, and non-hermiticity generated by typo/bugs in my code.

Is there a solution to this problem?

---

<div class="post-metadata">

**Author:** ![simsurace](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simsurace/32/30216_2.png) [@simsurace](https://discourse.julialang.org/u/simsurace)\
**Post date:** [June 10, 2024, 8:15pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443/2 "2024-06-10T20:15:27Z")

</div>

You can use a `Hermitian` wrapper. The function `inv` will return another instance of `Hermitian`.

---

<div class="post-metadata">

**Author:** ![archisman](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/archisman/32/51867_2.png) [@archisman](https://discourse.julialang.org/u/archisman)\
**Post date:** [June 10, 2024, 8:18pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443/3 "2024-06-10T20:18:15Z")

</div>

Can you please provide a small example of how to use the wrapper?

---

<div class="post-metadata">

**Author:** ![mikmoore](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/mikmoore/32/31109_2.png) [@mikmoore](https://discourse.julialang.org/u/mikmoore)\
**Post date:** [June 10, 2024, 8:19pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443/4 "2024-06-10T20:19:12Z")

</div>

```julia-repl
julia> using LinearAlgebra

julia> a = Hermitian(randn(3,3))
3×3 Hermitian{Float64, Matrix{Float64}}:
  0.155291 -1.07756 -0.185214
 -1.07756 -0.241846 -0.642284
 -0.185214 -0.642284 -0.152622

julia> inv(a)
3×3 Hermitian{Float64, Matrix{Float64}}:
  2.90744 0.352187 -5.01043
  0.352187 0.448985 -2.31687
 -5.01043 -2.31687 9.27839

```

---

<div class="post-metadata">

**Author:** ![Oscar\_Smith](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/oscar_smith/32/25343_2.png) [@Oscar\_Smith](https://discourse.julialang.org/u/Oscar_Smith)\
**Post date:** [June 10, 2024, 8:51pm UTC](https://discourse.julialang.org/t/julia-thinks-inverse-of-a-hermitian-matrix-is-not-hermitian/115443/5 "2024-06-10T20:51:44Z")

</div>

note also that giving Julia this extra info will make the inverse faster since you don’t have to look at the whole matrix.

Also as per usual, you almost never should be using inv. factorization and linear solving is typically better.
