multilinear-0.4.0.0: src/Multilinear/Matrix.hs
{-|
Module : Multilinear.Matrix
Description : Matrix constructors (finitely- or infinitely dimensional)
Copyright : (c) Artur M. Brodzki, 2018
License : BSD3
Maintainer : artur@brodzki.org
Stability : experimental
Portability : Windows/POSIX
- This module provides convenient constructors that generates a matrix (finitely- or infinite-dimensional)
- Finitely-dimensional matrices provide much greater performance than infinitely-dimensional
-}
module Multilinear.Matrix (
-- * Generators
Multilinear.Matrix.fromIndices,
Multilinear.Matrix.const
) where
import qualified Data.Vector.Unboxed as Unboxed
import Multilinear
invalidIndices :: String
invalidIndices = "Indices and its sizes not compatible with structure of matrix!"
{-| Generate matrix as function of its indices -}
fromIndices :: (
Num a, Unboxed.Unbox a, Multilinear t a
) => String -- ^ Indices names (one character per index, first character: rows index, second character: columns index)
-> Int -- ^ Number of matrix rows
-> Int -- ^ Number of matrix columns
-> (Int -> Int -> a) -- ^ Generator function - returns a matrix component at @i,j@
-> t a -- ^ Generated matrix
fromIndices [u,d] us ds f = Multilinear.fromIndices [u] [d] [us] [ds] $ \[ui] [di] -> f ui di
fromIndices _ _ _ _ = error invalidIndices
{-| Generate matrix with all components equal to @v@ -}
const :: (
Num a, Unboxed.Unbox a, Multilinear t a
) => String -- ^ Indices names (one character per index, first character: rows index, second character: columns index)
-> Int -- ^ Number of matrix rows
-> Int -- ^ Number of matrix columns
-> a -- ^ Value of matrix components
-> t a -- ^ Generated matrix
const [u,d] us ds = Multilinear.const [u] [d] [us] [ds]
const _ _ _ = \_ -> error invalidIndices