tomtom
February 27, 2019, 12:28am
#1
calling `LinearAlgebra.eigen()`

gives warntype. Is it a bug?

```
import Statistics
import LinearAlgebra
function test(x::Matrix{Float64})
sigma = Statistics.cov(x)
eig = LinearAlgebra.eigen(sigma)
return eig
end
julia> @code_warntype test(randn(20, 5) )
Body::Union{Eigen{Complex{Float64},Complex{Float64},Array{Complex{Float64},2},Array{Complex{Float64},1}}, Eigen{Float64,Float64,Array{Float64,2},Array{Float64,1}}}
1 β %1 = Statistics.cov::Core.Compiler.Const(Statistics.cov, false)
β %2 = invoke Statistics.:(#cov#37)(1::Int64, true::Bool, %1::Function, _2::Array{Float64,2})::Array{Float64,2}
β %3 = LinearAlgebra.eigen::Core.Compiler.Const(LinearAlgebra.eigen, false)
β %4 = invoke LinearAlgebra.:(#eigen#58)(true::Bool, true::Bool, %3::Function, %2::Array{Float64,2})::Union{Eigen{Complex{Float64},Complex{Float64},Array{Complex{Float64},2},Array{Complex{Float64},1}}, Eigen{Float64,Float64,Array{Float64,2},Array{Float64,1}}}
βββ return %4
```

The eigenvalues and eigenvectors can be real or complex. This is deliberate behaviour (not a bug).

1 Like

tomtom
February 27, 2019, 2:17am
#3
okay, even itβs not a bug, itβs a design issue: it gives a warntype, which would slows down runtime.

or, is it a special case that has no runtime impact?

moreover, as far as I know, for positive-semifinite matrix like the covariance, the Eigen values and vectors would always be real. Could we do better?

The amount of time spent on the warning will be tiny compared to the time taken to calculate the eigen-decomposition.

There is no type instability if the matrix is e.g. of type `Symmetric`

.

tomtom
February 27, 2019, 2:38am
#5
thanks! so, the function should better be written as:

```
function test2(x::Matrix{Float64})
sigma = Statistics.cov(x)
eig = LinearAlgebra.eigen(LinearAlgebra.Symmetric(sigma) )
return eig
end
x = randn(20, 5)
julia> test(x) == test2(x)
true
@code_warntype test2(x) # fine
```

1 Like

Maybe `Statistics.cov`

should automatically return a `Symmetric`

matrix?

1 Like

But probably that would lead to type instability somewhere down the line.

Note that you can test that the result type of the calculation is the same as the type that Julia infers using

```
using Test
@inferred test2(x)
```

1 Like

tomtom
February 27, 2019, 2:42am
#9
covariance is not only symmetric, itβs also positive-semi-finite (I think). It may be a big change to `LinearAlgebra`

and `Statistics`

to incorporate a special matrix type for it.

Elrod
February 27, 2019, 4:10am
#10
Yes, a covariance matrix is at least positive semi-definite.
If the number of linearly independent samples exceeds the dimensionality, it will be positive definite.

If youβre taking the eigendecomposition anyway, you can easily check whether all the eigenvalues are positive.

2 Likes