| Safe Haskell | None | 
|---|---|
| Language | Haskell98 | 
Numeric.LAPACK.Matrix.Square
Synopsis
- type Square sh = ArrayMatrix (Square sh)
 - size :: Square sh a -> sh
 - mapSize :: (sh0 -> sh1) -> Square sh0 a -> Square sh1 a
 - 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
 - congruence :: (C height, Eq height, C width, Eq width, Floating a) => Square height a -> General height width a -> Square width 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)
 - schurComplex :: (C sh, Real a, Complex a ~ ac) => Square sh ac -> (Square sh ac, Upper sh ac)
 - eigensystem :: (C sh, Floating a, ComplexOf a ~ ac) => Square sh a -> (Square sh ac, Vector sh ac, Square sh ac)
 - type ComplexOf x = Complex (RealOf x)
 
Documentation
type Square sh = ArrayMatrix (Square sh) Source #
fromScalar :: Storable a => a -> Square () a Source #
identityFromWidth :: (C height, C width, Floating a) => General height width a -> Square width a Source #
identityFromHeight :: (C height, C width, Floating a) => General height width a -> Square height a Source #
congruence :: (C height, Eq height, C width, Eq width, Floating a) => Square height a -> General height width a -> Square width a Source #
A^H * B * 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 Source #
schur :: (C sh, Floating a) => Square sh a -> (Square sh a, Square sh a) Source #
If (q,r) = schur a, then a = q <> r <> 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.
schurComplex :: (C sh, Real a, Complex a ~ ac) => Square sh ac -> (Square sh ac, Upper sh ac) Source #
eigensystem :: (C sh, Floating a, ComplexOf a ~ ac) => Square sh a -> (Square sh ac, Vector sh ac, Square sh ac) 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.