Stability | provisional |
---|---|
Maintainer | Alberto Ruiz |
Safe Haskell | None |
- module Numeric.LinearAlgebra.Data
- dot :: Numeric t => Vector t -> Vector t -> t
- (<·>) :: Numeric t => Vector t -> Vector t -> t
- app :: Numeric t => Matrix t -> Vector t -> Vector t
- (#>) :: Numeric t => Matrix t -> Vector t -> Vector t
- (!#>) :: GMatrix -> Vector Double -> Vector Double
- mul :: Numeric t => Matrix t -> Matrix t -> Matrix t
- (<>) :: Numeric t => Matrix t -> Matrix t -> Matrix t
- outer :: Product t => Vector t -> Vector t -> Matrix t
- kronecker :: Product t => Matrix t -> Matrix t -> Matrix t
- cross :: Vector Double -> Vector Double -> Vector Double
- scale :: Container c e => e -> c e -> c e
- sumElements :: Container c e => c e -> e
- prodElements :: Container c e => c e -> e
- (<\>) :: (LSDiv c, Field t) => Matrix t -> c t -> c t
- linearSolve :: Field t => Matrix t -> Matrix t -> Maybe (Matrix t)
- linearSolveLS :: Field t => Matrix t -> Matrix t -> Matrix t
- linearSolveSVD :: Field t => Matrix t -> Matrix t -> Matrix t
- luSolve :: Field t => (Matrix t, [Int]) -> Matrix t -> Matrix t
- cholSolve :: Field t => Matrix t -> Matrix t -> Matrix t
- cgSolve :: Bool -> GMatrix -> Vector Double -> Vector Double
- cgSolve' :: Bool -> R -> R -> Int -> GMatrix -> V -> V -> [CGState]
- inv :: Field t => Matrix t -> Matrix t
- pinv :: Field t => Matrix t -> Matrix t
- pinvTol :: Field t => Double -> Matrix t -> Matrix t
- rcond :: Field t => Matrix t -> Double
- rank :: Field t => Matrix t -> Int
- det :: Field t => Matrix t -> t
- invlndet :: Field t => Matrix t -> (Matrix t, (t, t))
- class Normed a where
- norm_Frob :: (Normed (Vector t), Element t) => Matrix t -> ℝ
- norm_nuclear :: Field t => Matrix t -> ℝ
- orth :: Field t => Matrix t -> Matrix t
- nullspace :: Field t => Matrix t -> Matrix t
- null1 :: Matrix Double -> Vector Double
- null1sym :: Matrix Double -> Vector Double
- svd :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)
- thinSVD :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)
- compactSVD :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)
- singularValues :: Field t => Matrix t -> Vector Double
- leftSV :: Field t => Matrix t -> (Matrix t, Vector Double)
- rightSV :: Field 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)
- eigenvalues :: Field t => Matrix t -> Vector (Complex Double)
- eigenvaluesSH :: Field t => Matrix t -> Vector Double
- eigenvaluesSH' :: Field t => Matrix t -> Vector Double
- geigSH' :: Field t => Matrix t -> Matrix t -> (Vector Double, Matrix t)
- qr :: Field t => Matrix t -> (Matrix t, Matrix t)
- rq :: Field t => Matrix t -> (Matrix t, Matrix t)
- qrRaw :: Field t => Matrix t -> (Matrix t, Vector t)
- qrgr :: Field t => Int -> (Matrix t, Vector t) -> Matrix t
- chol :: Field t => Matrix t -> Matrix t
- cholSH :: Field t => Matrix t -> Matrix t
- mbCholSH :: Field t => Matrix t -> Maybe (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 :: (Complex Double -> Complex Double) -> Matrix (Complex Double) -> Matrix (Complex Double)
- corr :: (Container Vector t, Product t) => Vector t -> Vector t -> Vector t
- conv :: (Container Vector t, Product t, Num t) => Vector t -> Vector t -> Vector t
- corrMin :: (Container Vector t, RealElement t, Product t) => Vector t -> Vector t -> Vector t
- corr2 :: Product a => Matrix a -> Matrix a -> Matrix a
- conv2 :: (Num (Matrix a), Product a, Container Vector a) => Matrix a -> Matrix a -> Matrix a
- type Seed = Int
- data RandDist
- randomVector :: Seed -> RandDist -> Int -> Vector Double
- rand :: Int -> Int -> IO (Matrix Double)
- randn :: Int -> Int -> IO (Matrix Double)
- gaussianSample :: Seed -> Int -> Vector Double -> Matrix Double -> Matrix Double
- uniformSample :: Seed -> Int -> [(Double, Double)] -> Matrix Double
- meanCov :: Matrix Double -> (Vector Double, Matrix Double)
- peps :: RealFloat x => x
- relativeError :: (Normed c t, Num (c t)) => NormType -> c t -> c t -> Double
- haussholder :: Field a => a -> Vector a -> Matrix a
- optimiseMult :: Monoid (Matrix t) => [Matrix t] -> Matrix t
- udot :: Product e => Vector e -> Vector e -> e
- nullspaceSVD :: Field t => Either Double Int -> Matrix t -> (Vector Double, Matrix t) -> Matrix t
- orthSVD :: Field t => Either Double Int -> Matrix t -> (Matrix t, Vector Double) -> Matrix t
- ranksv :: Double -> Int -> [Double] -> Int
- type ℝ = Double
- type ℂ = Complex Double
- iC :: ℂ
- class Storable a => Element a
- class (Complexable c, Fractional e, Element e) => Container c e
- class (Num e, Element e) => Product e
- class (Container Vector t, Container Matrix t, Konst t Int Vector, Konst t (Int, Int) Matrix, Product t) => Numeric t
- class LSDiv c
- class Complexable c
- class (Element t, Element (Complex t), RealFloat t) => RealElement t
- type family RealOf x
- type family ComplexOf x
- type family SingleOf x
- type family DoubleOf x
- type family IndexOf c
- class (Product t, Convert t, Container Vector t, Container Matrix t, Normed Matrix t, Normed Vector t, Floating t, RealOf t ~ Double) => Field t
- class Transposable m mt | m -> mt, mt -> m where
- tr :: m -> mt
- data CGState = CGState {}
- class Testable t where
Basic types and data processing
module Numeric.LinearAlgebra.Data
Arithmetic and numeric classes
The standard numeric classes are defined elementwise:
>>>
vector [1,2,3] * vector [3,0,-2]
fromList [3.0,0.0,-6.0]
>>>
matrix 3 [1..9] * ident 3
(3><3) [ 1.0, 0.0, 0.0 , 0.0, 5.0, 0.0 , 0.0, 0.0, 9.0 ]
In arithmetic operations single-element vectors and matrices
(created from numeric literals or using scalar
) automatically
expand to match the dimensions of the other operand:
>>>
5 + 2*ident 3 :: Matrix Double
(3><3) [ 7.0, 5.0, 5.0 , 5.0, 7.0, 5.0 , 5.0, 5.0, 7.0 ]
>>>
matrix 3 [1..9] + matrix 1 [10,20,30]
(3><3) [ 11.0, 12.0, 13.0 , 24.0, 25.0, 26.0 , 37.0, 38.0, 39.0 ]
Products
dot
(<·>) :: Numeric t => Vector t -> Vector t -> tSource
infix synonym for dot
>>>
vector [1,2,3,4] <·> vector [-2,0,1,1]
5.0
>>>
let 𝑖 = 0:+1 :: ℂ
>>>
fromList [1+𝑖,1] <·> fromList [1,1+𝑖]
2.0 :+ 0.0
matrix-vector
(#>) :: Numeric t => Matrix t -> Vector t -> Vector tSource
infix synonym for app
>>>
let m = (2><3) [1..]
>>>
m
(2><3) [ 1.0, 2.0, 3.0 , 4.0, 5.0, 6.0 ]
>>>
let v = vector [10,20,30]
>>>
m #> v
fromList [140.0,320.0]
(!#>) :: GMatrix -> Vector Double -> Vector DoubleSource
general matrix - vector product
>>>
let m = mkSparse [((0,999),1.0),((1,1999),2.0)]
>>>
m !#> vector [1..2000]
fromList [1000.0,4000.0]
matrix-matrix
(<>) :: Numeric t => Matrix t -> Matrix t -> Matrix tSource
infix synonym of mul
>>>
let a = (3><5) [1..]
>>>
a
(3><5) [ 1.0, 2.0, 3.0, 4.0, 5.0 , 6.0, 7.0, 8.0, 9.0, 10.0 , 11.0, 12.0, 13.0, 14.0, 15.0 ]
>>>
let b = (5><2) [1,3, 0,2, -1,5, 7,7, 6,0]
>>>
b
(5><2) [ 1.0, 3.0 , 0.0, 2.0 , -1.0, 5.0 , 7.0, 7.0 , 6.0, 0.0 ]
>>>
a <> b
(3><2) [ 56.0, 50.0 , 121.0, 135.0 , 186.0, 220.0 ]
The matrix product is also implemented in the Data.Monoid instance, where
single-element matrices (created from numeric literals or using scalar
)
are used for scaling.
>>>
import Data.Monoid as M
>>>
let m = matrix 3 [1..6]
>>>
m M.<> 2 M.<> diagl[0.5,1,0]
(2><3) [ 1.0, 4.0, 0.0 , 4.0, 10.0, 0.0 ]
mconcat
uses optimiseMult
to get the optimal association order.
other
outer :: Product t => Vector t -> Vector t -> Matrix tSource
Outer product of two vectors.
>>>
fromList [1,2,3] `outer` fromList [5,2,3]
(3><3) [ 5.0, 2.0, 3.0 , 10.0, 4.0, 6.0 , 15.0, 6.0, 9.0 ]
kronecker :: Product 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 ]
cross :: Vector Double -> Vector Double -> Vector DoubleSource
cross product (for three-element real vectors)
sumElements :: Container c e => c e -> eSource
the sum of elements
prodElements :: Container c e => c e -> eSource
the product of elements
Linear Systems
(<\>) :: (LSDiv c, Field t) => Matrix t -> c t -> c tSource
least squares solution of a linear system, similar to the \ operator of Matlab/Octave (based on linearSolveSVD)
linearSolve :: Field t => Matrix t -> Matrix t -> Maybe (Matrix t)Source
Solve a linear system (for square coefficient matrix and several right-hand sides) using the LU decomposition, returning Nothing for a singular system. For underconstrained or overconstrained systems use linearSolveLS
or linearSolveSVD
.
linearSolveLS :: Field t => Matrix t -> Matrix t -> Matrix tSource
Least squared error solution of an overconstrained linear system, or the minimum norm solution of an underconstrained system. For rank-deficient systems use linearSolveSVD
.
linearSolveSVD :: Field t => Matrix t -> Matrix t -> Matrix tSource
Minimum norm solution of a general linear least squares problem Ax=B using the SVD. Admits rank-deficient systems but it is slower than linearSolveLS
. The effective rank of A is determined by treating as zero those singular valures which are less than eps
times the largest singular value.
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
.
cholSolve :: Field t => Matrix t -> Matrix t -> Matrix tSource
Solve a symmetric or Hermitian positive definite linear system using a precomputed Cholesky decomposition obtained by chol
.
Inverse and pseudoinverse
pinv :: Field t => Matrix t -> Matrix tSource
Pseudoinverse of a general matrix with default tolerance (pinvTol
1, similar to GNU-Octave).
pinvTol :: Field t => Double -> Matrix t -> Matrix tSource
pinvTol r
computes the pseudoinverse of a matrix with tolerance tol=r*g*eps*(max rows cols)
, where g is the greatest singular value.
m = (3><3) [ 1, 0, 0 , 0, 1, 0 , 0, 0, 1e-10] :: Matrix Double
>>>
pinv m
1. 0. 0. 0. 1. 0. 0. 0. 10000000000.
>>>
pinvTol 1E8 m
1. 0. 0. 0. 1. 0. 0. 0. 1.
Determinant and rank
rcond :: Field t => Matrix t -> DoubleSource
Reciprocal of the 2-norm condition number of a matrix, computed from the singular values.
rank :: Field t => Matrix t -> IntSource
Number of linearly independent rows or columns. See also ranksv
det :: Field t => Matrix t -> tSource
Determinant of a square matrix. To avoid possible overflow or underflow use invlndet
.
Joint computation of inverse and logarithm of determinant of a square matrix.
Norms
norm_nuclear :: Field t => Matrix t -> ℝSource
Nullspace and range
orth :: Field t => Matrix t -> Matrix tSource
return an orthonormal basis of the range space of a matrix. See also orthSVD
.
nullspace :: Field t => Matrix t -> Matrix tSource
return an orthonormal basis of the null space of a matrix. See also nullspaceSVD
.
null1sym :: Matrix Double -> Vector DoubleSource
solution of overconstrained homogeneous symmetric linear system
SVD
svd :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)Source
Full singular value decomposition.
a = (5><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 , 13.0, 14.0, 15.0 ] :: Matrix Double
>>>
let (u,s,v) = svd a
>>>
disp 3 u
5x5 -0.101 0.768 0.614 0.028 -0.149 -0.249 0.488 -0.503 0.172 0.646 -0.396 0.208 -0.405 -0.660 -0.449 -0.543 -0.072 -0.140 0.693 -0.447 -0.690 -0.352 0.433 -0.233 0.398
>>>
s
fromList [35.18264833189422,1.4769076999800903,1.089145439970417e-15]
>>>
disp 3 v
3x3 -0.519 -0.751 0.408 -0.576 -0.046 -0.816 -0.632 0.659 0.408
>>>
let d = diagRect 0 s 5 3
>>>
disp 3 d
5x3 35.183 0.000 0.000 0.000 1.477 0.000 0.000 0.000 0.000 0.000 0.000 0.000
>>>
disp 3 $ u <> d <> tr v
5x3 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000
thinSVD :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)Source
A version of svd
which returns only the min (rows m) (cols m)
singular vectors of m
.
If (u,s,v) = thinSVD m
then m == u <> diag s <> tr v
.
a = (5><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 , 13.0, 14.0, 15.0 ] :: Matrix Double
>>>
let (u,s,v) = thinSVD a
>>>
disp 3 u
5x3 -0.101 0.768 0.614 -0.249 0.488 -0.503 -0.396 0.208 -0.405 -0.543 -0.072 -0.140 -0.690 -0.352 0.433
>>>
s
fromList [35.18264833189422,1.4769076999800903,1.089145439970417e-15]
>>>
disp 3 v
3x3 -0.519 -0.751 0.408 -0.576 -0.046 -0.816 -0.632 0.659 0.408
>>>
disp 3 $ u <> diag s <> tr v
5x3 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000
compactSVD :: Field t => Matrix t -> (Matrix t, Vector Double, Matrix t)Source
Similar to thinSVD
, returning only the nonzero singular values and the corresponding singular vectors.
a = (5><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 , 13.0, 14.0, 15.0 ] :: Matrix Double
>>>
let (u,s,v) = compactSVD a
>>>
disp 3 u
5x2 -0.101 0.768 -0.249 0.488 -0.396 0.208 -0.543 -0.072 -0.690 -0.352
>>>
s
fromList [35.18264833189422,1.4769076999800903]
>>>
disp 3 u
5x2 -0.101 0.768 -0.249 0.488 -0.396 0.208 -0.543 -0.072 -0.690 -0.352
>>>
disp 3 $ u <> diag s <> tr v
5x3 1.000 2.000 3.000 4.000 5.000 6.000 7.000 8.000 9.000 10.000 11.000 12.000 13.000 14.000 15.000
leftSV :: Field t => Matrix t -> (Matrix t, Vector Double)Source
Singular values and all left singular vectors (as columns).
rightSV :: Field t => Matrix t -> (Vector Double, Matrix t)Source
Singular values and all right singular vectors (as columns).
Eigensystems
eig :: Field t => Matrix t -> (Vector (Complex Double), Matrix (Complex Double))Source
Eigenvalues (not ordered) and eigenvectors (as columns) of a general square matrix.
If (s,v) = eig m
then m <> v == v <> diag s
a = (3><3) [ 3, 0, -2 , 4, 5, -1 , 3, 1, 0 ] :: Matrix Double
>>>
let (l, v) = eig a
>>>
putStr . dispcf 3 . asRow $ l
1x3 1.925+1.523i 1.925-1.523i 4.151
>>>
putStr . dispcf 3 $ v
3x3 -0.455+0.365i -0.455-0.365i 0.181 0.603 0.603 -0.978 0.033+0.543i 0.033-0.543i -0.104
>>>
putStr . dispcf 3 $ complex a <> v
3x3 -1.432+0.010i -1.432-0.010i 0.753 1.160+0.918i 1.160-0.918i -4.059 -0.763+1.096i -0.763-1.096i -0.433
>>>
putStr . dispcf 3 $ v <> diag l
3x3 -1.432+0.010i -1.432-0.010i 0.753 1.160+0.918i 1.160-0.918i -4.059 -0.763+1.096i -0.763-1.096i -0.433
eigSH :: Field t => Matrix t -> (Vector Double, Matrix t)Source
Eigenvalues and eigenvectors (as columns) of a complex hermitian or real symmetric matrix, in descending order.
If (s,v) = eigSH m
then m == v <> diag s <> tr v
a = (3><3) [ 1.0, 2.0, 3.0 , 2.0, 4.0, 5.0 , 3.0, 5.0, 6.0 ]
>>>
let (l, v) = eigSH a
>>>
l
fromList [11.344814282762075,0.17091518882717918,-0.5157294715892575]
>>>
disp 3 $ v <> diag l <> tr v
3x3 1.000 2.000 3.000 2.000 4.000 5.000 3.000 5.000 6.000
eigSH' :: Field t => Matrix t -> (Vector Double, Matrix t)Source
Similar to eigSH
without checking that the input matrix is hermitian or symmetric. It works with the upper triangular part.
eigenvalues :: Field t => Matrix t -> Vector (Complex Double)Source
Eigenvalues (not ordered) of a general square matrix.
eigenvaluesSH :: Field t => Matrix t -> Vector DoubleSource
Eigenvalues (in descending order) of a complex hermitian or real symmetric matrix.
eigenvaluesSH' :: Field t => Matrix t -> Vector DoubleSource
Similar to eigenvaluesSH
without checking that the input matrix is hermitian or symmetric. It works with the upper triangular part.
Generalized symmetric positive definite eigensystem Av = lBv, for A and B symmetric, B positive definite (conditions not checked).
QR
qr :: Field t => Matrix t -> (Matrix t, Matrix t)Source
QR factorization.
If (q,r) = qr m
then m == q <> r
, where q is unitary and r is upper triangular.
rq :: Field t => Matrix t -> (Matrix t, Matrix t)Source
RQ factorization.
If (r,q) = rq m
then m == r <> q
, where q is unitary and r is upper triangular.
qrgr :: Field t => Int -> (Matrix t, Vector t) -> Matrix tSource
generate a matrix with k orthogonal columns from the output of qrRaw
Cholesky
chol :: Field t => Matrix t -> Matrix tSource
Cholesky factorization of a positive definite hermitian or symmetric matrix.
If c = chol m
then c
is upper triangular and m == ctrans c <> c
.
cholSH :: Field t => Matrix t -> Matrix tSource
Similar to chol
, without checking that the input matrix is hermitian or symmetric. It works with the upper triangular part.
Hessenberg
hess :: Field t => Matrix t -> (Matrix t, Matrix t)Source
Hessenberg factorization.
If (p,h) = hess m
then m == p <> h <> ctrans p
, where p is unitary
and h is in upper Hessenberg form (it has zero entries below the first subdiagonal).
Schur
schur :: Field t => Matrix t -> (Matrix t, Matrix t)Source
Schur factorization.
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.
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 :: (Complex Double -> Complex Double) -> Matrix (Complex Double) -> Matrix (Complex Double)Source
Generic matrix functions for diagonalizable matrices. For instance:
logm = matFunc log
Correlation and convolution
correlation
>>>
corr (fromList[1,2,3]) (fromList [1..10])
fromList [14.0,20.0,26.0,32.0,38.0,44.0,50.0,56.0]
conv :: (Container Vector t, Product t, Num t) => Vector t -> Vector t -> Vector tSource
convolution (corr
with reversed kernel and padded input, equivalent to polynomial product)
>>>
conv (fromList[1,1]) (fromList [-1,1])
fromList [-1.0,0.0,1.0]
corr2 :: Product a => Matrix a -> Matrix a -> Matrix aSource
2D correlation (without padding)
>>>
disp 5 $ corr2 (konst 1 (3,3)) (ident 10 :: Matrix Double)
8x8 3 2 1 0 0 0 0 0 2 3 2 1 0 0 0 0 1 2 3 2 1 0 0 0 0 1 2 3 2 1 0 0 0 0 1 2 3 2 1 0 0 0 0 1 2 3 2 1 0 0 0 0 1 2 3 2 0 0 0 0 0 1 2 3
2D convolution
>>>
disp 5 $ conv2 (konst 1 (3,3)) (ident 10 :: Matrix Double)
12x12 1 1 1 0 0 0 0 0 0 0 0 0 1 2 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 3 2 1 0 0 0 0 0 0 0 0 1 2 2 1 0 0 0 0 0 0 0 0 0 1 1 1
Random arrays
Obtains a vector of pseudorandom elements (use randomIO to get a random seed).
rand :: Int -> Int -> IO (Matrix Double)Source
pseudorandom matrix with uniform elements between 0 and 1
randn :: Int -> Int -> IO (Matrix Double)Source
pseudorandom matrix with normal elements
>>>
disp 3 =<< randn 3 5
3x5 0.386 -1.141 0.491 -0.510 1.512 0.069 -0.919 1.022 -0.181 0.745 0.313 -0.670 -0.097 -1.575 -0.583
:: Seed | |
-> Int | number of rows |
-> Vector Double | mean vector |
-> Matrix Double | covariance matrix |
-> Matrix Double | result |
Obtains a matrix whose rows are pseudorandom samples from a multivariate Gaussian distribution.
Obtains a matrix whose rows are pseudorandom samples from a multivariate uniform distribution.
Misc
meanCov :: Matrix Double -> (Vector Double, Matrix Double)Source
Compute mean vector and covariance matrix of the rows of a matrix.
>>>
meanCov $ gaussianSample 666 1000 (fromList[4,5]) (diagl[2,3])
(fromList [4.010341078059521,5.0197204699640405], (2><2) [ 1.9862461923890056, -1.0127225830525157e-2 , -1.0127225830525157e-2, 3.0373954915729318 ])
relativeError :: (Normed c t, Num (c t)) => NormType -> c t -> c t -> DoubleSource
haussholder :: Field a => a -> Vector a -> Matrix aSource
:: Field t | |
=> Either Double Int | Left "numeric" zero (eg. 1* |
-> Matrix t | input matrix m |
-> (Vector Double, Matrix t) |
|
-> Matrix t | nullspace |
The nullspace of a matrix from its precomputed SVD decomposition.
:: Field t | |
=> Either Double Int | Left "numeric" zero (eg. 1* |
-> Matrix t | input matrix m |
-> (Matrix t, Vector Double) |
|
-> Matrix t | orth |
The range space a matrix from its precomputed SVD decomposition.
:: Double | numeric zero (e.g. 1* |
-> Int | maximum dimension of the matrix |
-> [Double] | singular values |
-> Int | rank of m |
Numeric rank of a matrix from its singular values.
Auxiliary classes
class Storable a => Element a Source
Supported matrix elements.
This class provides optimized internal
operations for selected element types.
It provides unoptimised defaults for any Storable
type,
so you can create instances simply as:
instance Element Foo
.
class (Complexable c, Fractional e, Element e) => Container c e Source
Basic element-by-element functions for numeric containers
class (Container Vector t, Container Matrix t, Konst t Int Vector, Konst t (Int, Int) Matrix, Product t) => Numeric t Source
class Complexable c Source
Structures that may contain complex numbers
class (Product t, Convert t, Container Vector t, Container Matrix t, Normed Matrix t, Normed Vector t, Floating t, RealOf t ~ Double) => Field t Source
class Transposable m mt | m -> mt, mt -> m whereSource
Transposable GMatrix GMatrix | |
Container Vector t => Transposable (Matrix t) (Matrix t) |