-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | A native implementation of matrix operations. -- -- Matrix library. Basic operations and some algorithms. -- -- To get the library update your cabal package list (if needed) with -- cabal update and then use cabal install matrix, -- assuming that you already have Cabal installed. Usage examples are -- included in the API reference generated by Haddock. -- -- If you want to use GSL, BLAS and LAPACK, hmatrix -- (http://hackage.haskell.org/package/hmatrix) is the way to go. @package matrix @version 0.2 -- | Matrix datatype and operations. -- -- Every provided example has been tested. module Data.Matrix -- | Type of matrices. data Matrix a -- | Display a matrix as a String using the Show instance of -- its elements. prettyMatrix :: Show a => Matrix a -> String -- | Number of rows. nrows :: Matrix a -> Int -- | Number of columns. ncols :: Matrix a -> Int -- | O(rows*cols). Similar to force, drop any extra memory. -- -- Useful when using submatrix from a big matrix. forceMatrix :: Matrix a -> Matrix a -- | Generate a matrix from a generator function. Example of usage: -- --
--                                    (  1  0 -1 -2 )
--                                    (  3  2  1  0 )
--                                    (  5  4  3  2 )
--   matrix 4 4 $ \(i,j) -> 2*i - j = (  7  6  5  4 )
--   
matrix :: Int -> Int -> ((Int, Int) -> a) -> Matrix a -- | Create a matrix from an non-empty list of non-empty lists. Each -- list must have the same number of elements. For example: -- --
--   fromLists [ [1,2,3]      ( 1 2 3 )
--             , [4,5,6]      ( 4 5 6 )
--             , [7,8,9] ] =  ( 7 8 9 )
--   
fromLists :: [[a]] -> Matrix a -- | O(1). Represent a vector as a one row matrix. rowVector :: Vector a -> Matrix a -- | O(1). Represent a vector as a one column matrix. colVector :: Vector a -> Matrix a -- | The zero matrix of the given size. -- --
--   zero n m =
--                   n
--     1 ( 0 0 ... 0 0 )
--     2 ( 0 0 ... 0 0 )
--       (     ...     )
--       ( 0 0 ... 0 0 )
--     n ( 0 0 ... 0 0 )
--   
zero :: Num a => Int -> Int -> Matrix a -- | Identity matrix of the given order. -- --
--   identity n =
--                   n
--     1 ( 1 0 ... 0 0 )
--     2 ( 0 1 ... 0 0 )
--       (     ...     )
--       ( 0 0 ... 1 0 )
--     n ( 0 0 ... 0 1 )
--   
identity :: Num a => Int -> Matrix a -- | Permutation matrix. -- --
--   permMatrix n i j =
--                 i     j       n
--     1 ( 1 0 ... 0 ... 0 ... 0 0 )
--     2 ( 0 1 ... 0 ... 0 ... 0 0 )
--       (     ...   ...   ...     )
--     i ( 0 0 ... 0 ... 1 ... 0 0 )
--       (     ...   ...   ...     )
--     j ( 0 0 ... 1 ... 0 ... 0 0 )
--       (     ...   ...   ...     )
--       ( 0 0 ... 0 ... 0 ... 1 0 )
--     n ( 0 0 ... 0 ... 0 ... 0 1 )
--   
-- -- When i == j it reduces to identity n. permMatrix :: Num a => Int -> Int -> Int -> Matrix a -- | O(1). Get an element of a matrix. getElem :: Int -> Int -> Matrix a -> a -- | Short alias for getElem. (!) :: Matrix a -> (Int, Int) -> a -- | O(1). Get a row of a matrix as a vector. getRow :: Int -> Matrix a -> Vector a -- | O(rows). Get a column of a matrix as a vector. getCol :: Int -> Matrix a -> Vector a -- | O(min rows cols). Diagonal of a not necessarily square -- matrix. getDiag :: Matrix a -> Vector a -- | O(1). Replace the value of a cell in a matrix. setElem :: a -> (Int, Int) -> Matrix a -> Matrix a -- | O(rows*cols). The transpose of a matrix. Example: -- --
--             ( 1 2 3 )   ( 1 4 7 )
--             ( 4 5 6 )   ( 2 5 8 )
--   transpose ( 7 8 9 ) = ( 3 6 9 )
--   
transpose :: Matrix a -> Matrix a -- | Extend a matrix to a given size adding zeroes. If the matrix already -- has the required size, nothing happens. The matrix is never -- reduced in size. Example: -- --
--                            ( 1 2 3 0 0 )
--                ( 1 2 3 )   ( 4 5 6 0 0 )
--                ( 4 5 6 )   ( 7 8 9 0 0 )
--   extendTo 4 5 ( 7 8 9 ) = ( 0 0 0 0 0 )
--   
extendTo :: Num a => Int -> Int -> Matrix a -> Matrix a -- | Map a function over a row. Example: -- --
--                            ( 1 2 3 )   ( 1 2 3 )
--                            ( 4 5 6 )   ( 5 6 7 )
--   mapRow (\_ x -> x + 1) 2 ( 7 8 9 ) = ( 7 8 9 )
--   
mapRow :: (Int -> a -> a) -> Int -> Matrix a -> Matrix a -- | Extract a submatrix given row and column limits. Example: -- --
--                     ( 1 2 3 )
--                     ( 4 5 6 )   ( 2 3 )
--   submatrix 1 2 2 3 ( 7 8 9 ) = ( 5 6 )
--   
submatrix :: Int -> Int -> Int -> Int -> Matrix a -> Matrix a -- | Remove a row and a column from a matrix. Example: -- --
--                   ( 1 2 3 )
--                   ( 4 5 6 )   ( 1 3 )
--   minorMatrix 2 2 ( 7 8 9 ) = ( 7 9 )
--   
minorMatrix :: Int -> Int -> Matrix a -> Matrix a -- | Make a block-partition of a matrix using a given element as reference. -- The element will stay in the bottom-right corner of the top-left -- corner matrix. -- --
--                   (             )   (      |      )
--                   (             )   ( ...  | ...  )
--                   (    x        )   (    x |      )
--   splitBlocks i j (             ) = (-------------) , where x = a_{i,j}
--                   (             )   (      |      )
--                   (             )   ( ...  | ...  )
--                   (             )   (      |      )
--   
-- -- Note that some blocks can end up empty. We use the following notation -- for these blocks: -- --
--   ( TL | TR )
--   (---------)
--   ( BL | BR )
--   
-- -- Where T = Top, B = Bottom, L = Left, R = Right. -- -- Implementation is done via slicing of vectors. splitBlocks :: Int -> Int -> Matrix a -> (Matrix a, Matrix a, Matrix a, Matrix a) -- | Horizontally join two matrices. Visually: -- --
--   ( A ) <|> ( B ) = ( A | B )
--   
-- -- Where both matrices A and B have the same number of -- rows. (<|>) :: Matrix a -> Matrix a -> Matrix a -- | Vertically join two matrices. Visually: -- --
--                     ( A )
--   ( A ) <-> ( B ) = ( - )
--                     ( B )
--   
-- -- Where both matrices A and B have the same number of -- columns. (<->) :: Matrix a -> Matrix a -> Matrix a -- | Join blocks of the form detailed in splitBlocks. joinBlocks :: (Matrix a, Matrix a, Matrix a, Matrix a) -> Matrix a -- | Standard matrix multiplication by definition. multStd :: Num a => Matrix a -> Matrix a -> Matrix a -- | Strassen's matrix multiplication. multStrassen :: Num a => Matrix a -> Matrix a -> Matrix a -- | Mixed Strassen's matrix multiplication. multStrassenMixed :: Num a => Matrix a -> Matrix a -> Matrix a -- | Scale a matrix by a given factor. Example: -- --
--                 ( 1 2 3 )   (  2  4  6 )
--                 ( 4 5 6 )   (  8 10 12 )
--   scaleMatrix 2 ( 7 8 9 ) = ( 14 16 18 )
--   
scaleMatrix :: Num a => a -> Matrix a -> Matrix a -- | Scale a row by a given factor. Example: -- --
--                ( 1 2 3 )   (  1  2  3 )
--                ( 4 5 6 )   (  8 10 12 )
--   scaleRow 2 2 ( 7 8 9 ) = (  7  8  9 )
--   
scaleRow :: Num a => a -> Int -> Matrix a -> Matrix a -- | Add to one row a scalar multiple of other row. Example: -- --
--                     ( 1 2 3 )   (  1  2  3 )
--                     ( 4 5 6 )   (  6  9 12 )
--   combineRows 2 2 1 ( 7 8 9 ) = (  7  8  9 )
--   
combineRows :: Num a => Int -> a -> Int -> Matrix a -> Matrix a -- | Switch two rows of a matrix. Example: -- --
--                  ( 1 2 3 )   ( 4 5 6 )
--                  ( 4 5 6 )   ( 1 2 3 )
--   switchRows 1 2 ( 7 8 9 ) = ( 7 8 9 )
--   
switchRows :: Int -> Int -> Matrix a -> Matrix a -- | Matrix LU decomposition with partial pivoting. The result for a -- matrix M is given in the format (U,L,P,d) where: -- -- -- -- These properties are only guaranteed when the input matrix is -- invertible. An additional property matches thanks to the strategy -- followed for pivoting: -- -- -- -- This follows from the maximal property of the selected pivots, which -- also leads to a better numerical stability of the algorithm. -- -- Example: -- --
--            ( 1 2 0 )     ( 2 0  2 )   (   1 0 0 )   ( 0 0 1 )
--            ( 0 2 1 )     ( 0 2 -1 )   ( 1/2 1 0 )   ( 1 0 0 )
--   luDecomp ( 2 0 2 ) = ( ( 0 0  2 ) , (   0 1 1 ) , ( 0 1 0 ) , 1 )
--   
luDecomp :: (Ord a, Fractional a) => Matrix a -> (Matrix a, Matrix a, Matrix a, a) -- | Sum of the elements in the diagonal. See also getDiag. Example: -- --
--         ( 1 2 3 )
--         ( 4 5 6 )
--   trace ( 7 8 9 ) = 15
--   
trace :: Num a => Matrix a -> a -- | Product of the elements in the diagonal. See also getDiag. -- Example: -- --
--            ( 1 2 3 )
--            ( 4 5 6 )
--   diagProd ( 7 8 9 ) = 45
--   
diagProd :: Num a => Matrix a -> a -- | Matrix determinant using Laplace expansion. If the elements of the -- Matrix are instance of Ord and Fractional -- consider to use detLU in order to obtain better performance. detLaplace :: Num a => Matrix a -> a -- | Matrix determinant using LU decomposition. detLU :: (Ord a, Fractional a) => Matrix a -> a instance Eq a => Eq (Matrix a) instance Num a => Num (Matrix a) instance Functor Matrix instance NFData a => NFData (Matrix a) instance Show a => Show (Matrix a)