 # Triangular Schur decomposition for a matrix with complex eigenvalues?

Is it possible to compute a (strictly) triangular Schur decomposition for a matrix with complex eigenvalues?

With the code below I create such a matrix:

``````T = rand(2,2)
λ = rand() + rand()*im
D = [real(λ) imag(λ); -imag(λ) real(λ)]
A = T*D/T
``````

`schur` then returns a quasitriangular decomposition. In my case of a 2x2 matrix with complex eigenvalues:

``````S,U,Λ = schur(A)
``````
``````Schur{Float64,Array{Float64,2}}
T factor:
2×2 Array{Float64,2}:
0.921219  -0.0444826
4.41202    0.921219
Z factor:
2×2 Array{Float64,2}:
0.774798  0.632209
-0.632209  0.774798
eigenvalues:
2-element Array{Complex{Float64},1}:
0.9212193623156234 + 0.44301030411320136im
0.9212193623156234 - 0.44301030411320136im
``````

Yes. Do `schur(complex(A))`.

It would be nice to have a function to get this directly from the quasitriangular decomposition, since that would probably be faster (taking advantage of `A` being real for most of the computation), but I don’t think that is implemented? (Should be very straightforward to implement since you just need the Schur decompositions of a bunch of 2x2 blocks.)

1 Like

Many thanks. Exactly what I needed.

The conversion is implemented as `triangularize` in the `GenericSchur` package.

2 Likes

We might want to move that into the `LinearAlgebra` stdlib, because some of the matrix-function calculations in `LinearAlgebra` already need the triangular Schur form and resort to the expensive `schur(complex(A))` method to get it IIRC.

1 Like