Safe Haskell | None |
---|
- type Square sh = Array (Square sh)
- size :: Square sh a -> sh
- toFull :: (C vert, C horiz) => Square sh a -> Full vert horiz sh sh a
- toGeneral :: Square sh a -> General sh sh a
- fromGeneral :: Eq sh => General sh sh a -> Square sh a
- fromScalar :: Storable a => a -> Square () a
- toScalar :: Storable a => Square () a -> a
- fromList :: (C sh, Storable a) => sh -> [a] -> Square sh a
- autoFromList :: Storable a => [a] -> Square ZeroInt a
- transpose :: Square sh a -> Square sh a
- adjoint :: (C sh, Floating a) => Square sh a -> Square sh a
- identity :: (C sh, Floating a) => sh -> Square sh a
- identityFrom :: (C sh, Floating a) => Square sh a -> Square sh a
- identityFromWidth :: (C height, C width, Floating a) => General height width a -> Square width a
- identityFromHeight :: (C height, C width, Floating a) => General height width a -> Square height a
- diagonal :: (C sh, Floating a) => Vector sh a -> Square sh a
- takeDiagonal :: (C sh, Floating a) => Square sh a -> Vector sh a
- trace :: (C sh, Floating a) => Square sh a -> a
- multiply :: (C sh, Eq sh, Floating a) => Square sh a -> Square sh a -> Square sh a
- square :: (C sh, Floating a) => Square sh a -> Square sh a
- power :: (C sh, Floating a) => Integer -> Square sh a -> Square sh a
- solve :: (C vert, C horiz, C sh, Eq sh, C nrhs, Floating a) => Square sh a -> Full vert horiz sh nrhs a -> Full vert horiz sh nrhs a
- inverse :: (C sh, Floating a) => Square sh a -> Square sh a
- determinant :: (C sh, Floating a) => Square sh a -> a
- eigenvalues :: (C sh, Floating a) => Square sh a -> Vector sh (ComplexOf a)
- schur :: (C sh, Floating a) => Square sh a -> (Square sh a, Square sh a)
- eigensystem :: (C sh, Floating a) => Square sh a -> (Square sh (ComplexOf a), Vector sh (ComplexOf a), Square sh (ComplexOf a))
- type ComplexOf x = Complex (RealOf x)
Documentation
fromGeneral :: Eq sh => General sh sh a -> Square sh aSource
fromScalar :: Storable a => a -> Square () aSource
autoFromList :: Storable a => [a] -> Square ZeroInt aSource
identityFromWidth :: (C height, C width, Floating a) => General height width a -> Square width aSource
identityFromHeight :: (C height, C width, Floating a) => General height width a -> Square height aSource
solve :: (C vert, C horiz, C sh, Eq sh, C nrhs, Floating a) => Square sh a -> Full vert horiz sh nrhs a -> Full vert horiz sh nrhs aSource
determinant :: (C sh, Floating a) => Square sh a -> aSource
schur :: (C sh, Floating a) => Square sh a -> (Square sh a, Square sh a)Source
If (q,r) = schur a
, then a = q <> adjoint q
,
where q
is unitary (orthogonal)
and r
is a right-upper triangular matrix for complex a
and a 1x1-or-2x2-block upper triangular matrix for real a
.
With takeDiagonal r
you get all eigenvalues of a
if a
is complex
and the real parts of the eigenvalues if a
is real.
Complex conjugated eigenvalues of a real matrix a
are encoded as 2x2 blocks along the diagonal.
eigensystem :: (C sh, Floating a) => Square sh a -> (Square sh (ComplexOf a), Vector sh (ComplexOf a), Square sh (ComplexOf a))Source
(vr,d,vl) = eigensystem a
Counterintuitively, vr
contains the right eigenvectors
and vl
contains the left eigenvectors as columns.
The idea is to provide a decomposition of a
.
If a
is diagonalizable, then vr
and vl
are almost inverse to each other.
More precisely, adjoint vl <#> vr
is a diagonal matrix.
This is because all eigenvectors are normalized to Euclidean norm 1.
With the following scaling, the decomposition becomes perfect:
let scal = Array.map recip $ takeDiagonal $ adjoint vl <#> vr a == vr <#> diagonal d <#> diagonal scal <#> adjoint vl
If a
is non-diagonalizable then some columns of vr
and vl
are left zero
and the above property does not hold.