lapack-0.3: Numerical Linear Algebra using LAPACK

Numeric.LAPACK.Matrix.Square

Synopsis

# Documentation

size :: Square sh a -> sh Source #

mapSize :: (sh0 -> sh1) -> Square sh0 a -> Square sh1 a Source #

toFull :: (C vert, C horiz) => Square sh a -> Full vert horiz sh sh a Source #

toGeneral :: Square sh a -> General sh sh a Source #

fromGeneral :: Eq sh => General sh sh a -> Square sh a Source #

fromScalar :: Storable a => a -> Square () a Source #

toScalar :: Storable a => Square () a -> a Source #

fromList :: (C sh, Storable a) => sh -> [a] -> Square sh a Source #

transpose :: Square sh a -> Square sh a Source #

adjoint :: (C sh, Floating a) => Square sh a -> Square sh a Source #

conjugate transpose

identity :: (C sh, Floating a) => sh -> Square sh a Source #

identityFrom :: (C sh, Floating a) => Square sh a -> Square sh 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 #

diagonal :: (C sh, Floating a) => Vector sh a -> Square sh a Source #

takeDiagonal :: (C sh, Floating a) => Square sh a -> Vector sh a Source #

trace :: (C sh, Floating a) => Square sh a -> a Source #

multiply :: (C sh, Eq sh, Floating a) => Square sh a -> Square sh a -> Square sh a Source #

square :: (C sh, Floating a) => Square sh a -> Square sh a Source #

power :: (C sh, Floating a) => Integer -> Square sh a -> Square sh 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 #

inverse :: (C sh, Floating a) => Square sh a -> Square sh a Source #

determinant :: (C sh, Floating a) => Square sh a -> a Source #

eigenvalues :: (C sh, Floating a) => Square sh a -> Vector sh (ComplexOf 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.