Portability | uses ffi |
---|---|
Stability | provisional |
Maintainer | Alberto Ruiz (aruiz at um dot es) |
A generic interface for some common functions. Using it we can write higher level algorithms and testing properties both for real and complex matrices.
In any case, the specific functions for particular base types can also be explicitly imported from Numeric.LinearAlgebra.LAPACK.
- class (Normed (Matrix t), Linear Vector t, Linear Matrix t) => Field t
- multiply :: Field t => Matrix t -> Matrix t -> Matrix t
- dot :: Field t => Vector t -> Vector t -> t
- outer :: Field t => Vector t -> Vector t -> Matrix t
- kronecker :: Field t => Matrix t -> Matrix t -> Matrix t
- linearSolve :: Field t => Matrix t -> Matrix t -> Matrix t
- luSolve :: Field t => (Matrix t, [Int]) -> Matrix t -> Matrix t
- linearSolveSVD :: Field t => Matrix t -> Matrix t -> Matrix t
- inv :: Field t => Matrix t -> Matrix t
- pinv :: Field t => Matrix t -> Matrix t
- det :: Field t => Matrix t -> t
- rank :: Field t => Matrix t -> Int
- rcond :: Field t => Matrix t -> Double
- svd :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)
- full :: Element t => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Matrix Double, Matrix t)
- economy :: Element t => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Vector Double, Matrix t)
- eig :: Field t => Matrix t -> (Vector (Complex Double), Matrix (Complex Double))
- eigSH :: Field t => Matrix t -> (Vector Double, Matrix t)
- eigSH' :: Field t => Matrix t -> (Vector Double, Matrix t)
- qr :: Field t => Matrix t -> (Matrix t, Matrix t)
- chol :: Field t => Matrix t -> Matrix t
- cholSH :: Field t => Matrix t -> Matrix t
- hess :: Field t => Matrix t -> (Matrix t, Matrix t)
- schur :: Field t => Matrix t -> (Matrix t, Matrix t)
- lu :: Field t => Matrix t -> (Matrix t, Matrix t, Matrix t, t)
- luPacked :: Field t => Matrix t -> (Matrix t, [Int])
- expm :: Field t => Matrix t -> Matrix t
- sqrtm :: Field t => Matrix t -> Matrix t
- matFunc :: Field t => (Complex Double -> Complex Double) -> Matrix t -> Matrix (Complex Double)
- nullspacePrec :: Field t => Double -> Matrix t -> [Vector t]
- nullVector :: Field t => Matrix t -> Vector t
- class Normed t where
- data NormType
- ctrans :: Field t => Matrix t -> Matrix t
- eps :: Double
- i :: Complex Double
- haussholder :: Field a => a -> Vector a -> Matrix a
- unpackQR :: Field t => (Matrix t, Vector t) -> (Matrix t, Matrix t)
- unpackHess :: Field t => (Matrix t -> (Matrix t, Vector t)) -> Matrix t -> (Matrix t, Matrix t)
- pinvTol :: Double -> Matrix Double -> Matrix Double
Supported types
class (Normed (Matrix t), Linear Vector t, Linear Matrix t) => Field t Source
Auxiliary typeclass used to define generic computations for both real and complex matrices.
Products
kronecker :: Field t => Matrix t -> Matrix t -> Matrix tSource
Kronecker product of two matrices.
m1=(2><3) [ 1.0, 2.0, 0.0 , 0.0, -1.0, 3.0 ] m2=(4><3) [ 1.0, 2.0, 3.0 , 4.0, 5.0, 6.0 , 7.0, 8.0, 9.0 , 10.0, 11.0, 12.0 ]
> kronecker m1 m2 (8><9) [ 1.0, 2.0, 3.0, 2.0, 4.0, 6.0, 0.0, 0.0, 0.0 , 4.0, 5.0, 6.0, 8.0, 10.0, 12.0, 0.0, 0.0, 0.0 , 7.0, 8.0, 9.0, 14.0, 16.0, 18.0, 0.0, 0.0, 0.0 , 10.0, 11.0, 12.0, 20.0, 22.0, 24.0, 0.0, 0.0, 0.0 , 0.0, 0.0, 0.0, -1.0, -2.0, -3.0, 3.0, 6.0, 9.0 , 0.0, 0.0, 0.0, -4.0, -5.0, -6.0, 12.0, 15.0, 18.0 , 0.0, 0.0, 0.0, -7.0, -8.0, -9.0, 21.0, 24.0, 27.0 , 0.0, 0.0, 0.0, -10.0, -11.0, -12.0, 30.0, 33.0, 36.0 ]
Linear Systems
linearSolve :: Field t => Matrix t -> Matrix t -> Matrix tSource
Solution of a general linear system (for several right-hand sides) using lapacks' dgesv or zgesv.
It is similar to luSolve
. luPacked
, but linearSolve
raises an error if called on a singular system.
See also other versions of linearSolve in Numeric.LinearAlgebra.LAPACK.
luSolve :: Field t => (Matrix t, [Int]) -> Matrix t -> Matrix tSource
Solution of a linear system (for several right hand sides) from the precomputed LU factorization
obtained by luPacked
.
inv :: Field t => Matrix t -> Matrix tSource
Inverse of a square matrix using lapacks' dgesv and zgesv.
pinv :: Field t => Matrix t -> Matrix tSource
Pseudoinverse of a general matrix using lapack's dgelss or zgelss.
det :: Field t => Matrix t -> tSource
determinant of a square matrix, computed from the LU decomposition.
rcond :: Field t => Matrix t -> DoubleSource
Reciprocal of the 2-norm condition number of a matrix, computed from the SVD.
Matrix factorizations
Singular value decomposition
svd :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)Source
Singular value decomposition using lapack's dgesvd or zgesvd.
full :: Element t => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Matrix Double, Matrix t)Source
A version of svd
which returns an appropriate diagonal matrix with the singular values.
If (u,d,v) = full svd m
then m == u <> d <> trans v
.
economy :: Element t => (Matrix t -> (Matrix t, Vector Double, Matrix t)) -> Matrix t -> (Matrix t, Vector Double, Matrix t)Source
A version of svd
which returns only the nonzero singular values and the corresponding rows and columns of the rotations.
If (u,s,v) = economy svd m
then m == u <> diag s <> trans v
.
Eigensystems
eig :: Field t => Matrix t -> (Vector (Complex Double), Matrix (Complex Double))Source
Eigenvalues and eigenvectors of a general square matrix using lapack's dgeev or zgeev.
If (s,v) = eig m
then m <> v == v <> diag s
eigSH :: Field t => Matrix t -> (Vector Double, Matrix t)Source
Eigenvalues and Eigenvectors of a complex hermitian or real symmetric matrix using lapack's dsyev or zheev.
If (s,v) = eigSH m
then m == v <> diag s <> ctrans v
eigSH' :: Field t => Matrix t -> (Vector Double, Matrix t)Source
Similar to eigSH
without checking that the input matrix is hermitian or symmetric.
QR
qr :: Field t => Matrix t -> (Matrix t, Matrix t)Source
QR factorization using lapack's dgeqr2 or zgeqr2.
If (q,r) = qr m
then m == q <> r
, where q is unitary and r is upper triangular.
Cholesky
chol :: Field t => Matrix t -> Matrix tSource
Cholesky factorization of a positive definite hermitian or symmetric matrix using lapack's dpotrf or zportrf.
If c = chol m
then m == ctrans c <> c
.
cholSH :: Field t => Matrix t -> Matrix tSource
Similar to chol
without checking that the input matrix is hermitian or symmetric.
Hessenberg
hess :: Field t => Matrix t -> (Matrix t, Matrix t)Source
Hessenberg factorization using lapack's dgehrd or zgehrd.
If (p,h) = hess m
then m == p <> h <> ctrans p
, where p is unitary
and h is in upper Hessenberg form.
Schur
schur :: Field t => Matrix t -> (Matrix t, Matrix t)Source
Schur factorization using lapack's dgees or zgees.
If (u,s) = schur m
then m == u <> s <> ctrans u
, where u is unitary
and s is a Shur matrix. A complex Schur matrix is upper triangular. A real Schur matrix is
upper triangular in 2x2 blocks.
"Anything that the Jordan decomposition can do, the Schur decomposition can do better!" (Van Loan)
LU
lu :: Field t => Matrix t -> (Matrix t, Matrix t, Matrix t, t)Source
Explicit LU factorization of a general matrix using lapack's dgetrf or zgetrf.
If (l,u,p,s) = lu m
then m == p <> l <> u
, where l is lower triangular,
u is upper triangular, p is a permutation matrix and s is the signature of the permutation.
luPacked :: Field t => Matrix t -> (Matrix t, [Int])Source
Obtains the LU decomposition of a matrix in a compact data structure suitable for luSolve
.
Matrix functions
expm :: Field t => Matrix t -> Matrix tSource
Matrix exponential. It uses a direct translation of Algorithm 11.3.1 in Golub & Van Loan, based on a scaled Pade approximation.
sqrtm :: Field t => Matrix t -> Matrix tSource
Matrix square root. Currently it uses a simple iterative algorithm described in Wikipedia.
It only works with invertible matrices that have a real solution. For diagonalizable matrices you can try matFunc sqrt
.
m = (2><2) [4,9 ,0,4] :: Matrix Double
>sqrtm m (2><2) [ 2.0, 2.25 , 0.0, 2.0 ]
matFunc :: Field t => (Complex Double -> Complex Double) -> Matrix t -> Matrix (Complex Double)Source
Generic matrix functions for diagonalizable matrices. For instance:
logm = matFunc log
Nullspace
:: Field t | |
=> Double | relative tolerance in |
-> Matrix t | input matrix |
-> [Vector t] | list of unitary vectors spanning the nullspace |
The nullspace of a matrix from its SVD decomposition.
nullVector :: Field t => Matrix t -> Vector tSource
The nullspace of a matrix, assumed to be one-dimensional, with default tolerance (shortcut for last . nullspacePrec 1
).
Norms
Objects which have a p-norm. Using it you can define convenient shortcuts:
norm2 x = pnorm PNorm2 x
frobenius m = norm2 . flatten $ m
Misc
The machine precision of a Double: eps = 2.22044604925031e-16
(the value used by GNU-Octave).
Util
haussholder :: Field a => a -> Vector a -> Matrix aSource