Operations on matrices (doublynested parallel vectors). All operations in this module assume rectangular matrices.
 type Matrix a = Vector (Vector (Data a))
 freezeMatrix :: Type a => Matrix a > Data [[a]]
 unfreezeMatrix :: Type a => Data [[a]] > Matrix a
 unfreezeMatrix' :: Type a => Length > Length > Data [[a]] > Matrix a
 matrix :: Type a => [[a]] > Matrix a
 indexedMat :: Data Length > Data Length > (Data Index > Data Index > Data a) > Matrix a
 transpose :: Type a => Matrix a > Matrix a
 flatten :: Type a => Matrix a > Vector (Data a)
 diagonal :: Type a => Matrix a > Vector (Data a)
 distributeL :: (a > b > c) > a > Vector b > Vector c
 distributeR :: (a > b > c) > Vector a > b > Vector c
 class Mul a b where
 mulMat :: Numeric a => Matrix a > Matrix a > Matrix a
 class Syntactic a => ElemWise a where
 (.+) :: (ElemWise a, Num (Elem a)) => a > a > a
 (.) :: (ElemWise a, Num (Elem a)) => a > a > a
 (.*) :: (ElemWise a, Num (Elem a)) => a > a > a
Documentation
freezeMatrix :: Type a => Matrix a > Data [[a]]Source
Converts a matrix to a core array.
unfreezeMatrix :: Type a => Data [[a]] > Matrix aSource
Converts a core array to a matrix.
unfreezeMatrix' :: Type a => Length > Length > Data [[a]] > Matrix aSource
Converts a core array to a matrix. The first length argument is the number of rows (outer vector), and the second argument is the number of columns (inner argument).
matrix :: Type a => [[a]] > Matrix aSource
Constructs a matrix. The elements are stored in a core array.
indexedMat :: Data Length > Data Length > (Data Index > Data Index > Data a) > Matrix aSource
Constructing a matrix from an index function.
indexedMat m n ixf
:

m
is the number of rows. 
n
is the number of columns. 
ifx
is a function mapping indexes to elements (first argument is row index; second argument is column index).
diagonal :: Type a => Matrix a > Vector (Data a)Source
The diagonal vector of a square matrix. It happens to work if the number of rows is less than the number of columns, but not the other way around (this would require some overhead).
distributeL :: (a > b > c) > a > Vector b > Vector cSource
distributeR :: (a > b > c) > Vector a > b > Vector cSource
Numeric a => Mul (Data a) (Matrix a)  
Numeric a => Mul (Data a) (DVector a)  
Numeric a => Mul (Data a) (Data a)  
Numeric a => Mul (DVector a) (Matrix a)  
Numeric a => Mul (DVector a) (DVector a)  
Numeric a => Mul (DVector a) (Data a)  
Numeric a => Mul (Matrix a) (Matrix a)  
Numeric a => Mul (Matrix a) (DVector a)  
Numeric a => Mul (Matrix a) (Data a) 