numhask-0.1.1: A numeric prelude

Safe HaskellNone
LanguageHaskell2010

NumHask.Matrix

Contents

Description

Two-dimensional arrays. Two classes are supplied

  • Matrix where shape information is held at type level, and
  • SomeMatrix where shape is held at the value level.

In both cases, the underlying data is contained as a flat vector for efficiency purposes.

Synopsis

Documentation

newtype Matrix m n a Source #

A two-dimensional array where shape is specified at the type level The main purpose of this, beyond safe typing, is to supply the Representable instance with an initial object. A single Boxed Vector is used underneath for efficient slicing, but this may change or become polymorphic in the future.

todo: the natural type for a matrix, the output from a vector outer product for example, is a Vector (Vector a). We should be able to unify to a different representation such as this, using type families.

Constructors

Matrix 

Fields

Instances

Functor (Matrix k1 k m n) Source # 

Methods

fmap :: (a -> b) -> Matrix k1 k m n a -> Matrix k1 k m n b #

(<$) :: a -> Matrix k1 k m n b -> Matrix k1 k m n a #

Foldable (Matrix k1 k m n) Source # 

Methods

fold :: Monoid m => Matrix k1 k m n m -> m #

foldMap :: Monoid m => (a -> m) -> Matrix k1 k m n a -> m #

foldr :: (a -> b -> b) -> b -> Matrix k1 k m n a -> b #

foldr' :: (a -> b -> b) -> b -> Matrix k1 k m n a -> b #

foldl :: (b -> a -> b) -> b -> Matrix k1 k m n a -> b #

foldl' :: (b -> a -> b) -> b -> Matrix k1 k m n a -> b #

foldr1 :: (a -> a -> a) -> Matrix k1 k m n a -> a #

foldl1 :: (a -> a -> a) -> Matrix k1 k m n a -> a #

toList :: Matrix k1 k m n a -> [a] #

null :: Matrix k1 k m n a -> Bool #

length :: Matrix k1 k m n a -> Int #

elem :: Eq a => a -> Matrix k1 k m n a -> Bool #

maximum :: Ord a => Matrix k1 k m n a -> a #

minimum :: Ord a => Matrix k1 k m n a -> a #

sum :: Num a => Matrix k1 k m n a -> a #

product :: Num a => Matrix k1 k m n a -> a #

Traversable (Matrix k1 k m n) Source # 

Methods

traverse :: Applicative f => (a -> f b) -> Matrix k1 k m n a -> f (Matrix k1 k m n b) #

sequenceA :: Applicative f => Matrix k1 k m n (f a) -> f (Matrix k1 k m n a) #

mapM :: Monad m => (a -> m b) -> Matrix k1 k m n a -> m (Matrix k1 k m n b) #

sequence :: Monad m => Matrix k1 k m n (m a) -> m (Matrix k1 k m n a) #

(KnownNat m, KnownNat n) => Distributive (Matrix Nat Nat m n) Source # 

Methods

distribute :: Functor f => f (Matrix Nat Nat m n a) -> Matrix Nat Nat m n (f a) #

collect :: Functor f => (a -> Matrix Nat Nat m n b) -> f a -> Matrix Nat Nat m n (f b) #

distributeM :: Monad m => m (Matrix Nat Nat m n a) -> Matrix Nat Nat m n (m a) #

collectM :: Monad m => (a -> Matrix Nat Nat m n b) -> m a -> Matrix Nat Nat m n (m b) #

(KnownNat m, KnownNat n) => Representable (Matrix Nat Nat m n) Source # 

Associated Types

type Rep (Matrix Nat Nat m n :: * -> *) :: * #

Methods

tabulate :: (Rep (Matrix Nat Nat m n) -> a) -> Matrix Nat Nat m n a #

index :: Matrix Nat Nat m n a -> Rep (Matrix Nat Nat m n) -> a #

(KnownNat m, KnownNat n) => HasShape (Matrix Nat Nat m n) Source # 

Associated Types

type Shape (Matrix Nat Nat m n :: * -> *) :: * Source #

Methods

shape :: Matrix Nat Nat m n a -> Shape (Matrix Nat Nat m n) Source #

(Semiring a, KnownNat m, KnownNat n) => Hilbert (Matrix Nat Nat m n) a Source # 

Methods

(<.>) :: Matrix Nat Nat m n a -> Matrix Nat Nat m n a -> a Source #

(KnownNat m, KnownNat n, AdditiveUnital a) => IsList (Matrix Nat Nat m n a) Source #

from flat list

Associated Types

type Item (Matrix Nat Nat m n a) :: * #

Methods

fromList :: [Item (Matrix Nat Nat m n a)] -> Matrix Nat Nat m n a #

fromListN :: Int -> [Item (Matrix Nat Nat m n a)] -> Matrix Nat Nat m n a #

toList :: Matrix Nat Nat m n a -> [Item (Matrix Nat Nat m n a)] #

Eq a => Eq (Matrix k1 k m n a) Source # 

Methods

(==) :: Matrix k1 k m n a -> Matrix k1 k m n a -> Bool #

(/=) :: Matrix k1 k m n a -> Matrix k1 k m n a -> Bool #

(Show a, KnownNat m, KnownNat n) => Show (Matrix Nat Nat m n a) Source # 

Methods

showsPrec :: Int -> Matrix Nat Nat m n a -> ShowS #

show :: Matrix Nat Nat m n a -> String #

showList :: [Matrix Nat Nat m n a] -> ShowS #

(KnownNat m, KnownNat n, Arbitrary a, AdditiveUnital a) => Arbitrary (Matrix Nat Nat m n a) Source # 

Methods

arbitrary :: Gen (Matrix Nat Nat m n a) #

shrink :: Matrix Nat Nat m n a -> [Matrix Nat Nat m n a] #

(KnownNat m, KnownNat n, AdditiveGroup a) => AdditiveGroup (Matrix Nat Nat m n a) Source # 

Methods

(-) :: Matrix Nat Nat m n a -> Matrix Nat Nat m n a -> Matrix Nat Nat m n a Source #

(KnownNat m, KnownNat n, Additive a) => Additive (Matrix Nat Nat m n a) Source # 

Methods

(+) :: Matrix Nat Nat m n a -> Matrix Nat Nat m n a -> Matrix Nat Nat m n a Source #

(KnownNat m, KnownNat n, AdditiveInvertible a) => AdditiveInvertible (Matrix Nat Nat m n a) Source # 

Methods

negate :: Matrix Nat Nat m n a -> Matrix Nat Nat m n a Source #

(KnownNat m, KnownNat n, AdditiveCommutative a) => AdditiveCommutative (Matrix Nat Nat m n a) Source # 
(KnownNat m, KnownNat n, AdditiveAssociative a) => AdditiveAssociative (Matrix Nat Nat m n a) Source # 
(KnownNat m, KnownNat n, AdditiveUnital a) => AdditiveUnital (Matrix Nat Nat m n a) Source # 

Methods

zero :: Matrix Nat Nat m n a Source #

(KnownNat m, KnownNat n, AdditiveMagma a) => AdditiveMagma (Matrix Nat Nat m n a) Source # 

Methods

plus :: Matrix Nat Nat m n a -> Matrix Nat Nat m n a -> Matrix Nat Nat m n a Source #

(KnownNat n, Fractional a, Eq a, BoundedField a, Semiring a) => MultiplicativeInvertible (Matrix Nat Nat n n a) Source # 

Methods

recip :: Matrix Nat Nat n n a -> Matrix Nat Nat n n a Source #

(KnownNat n, Semiring a) => MultiplicativeAssociative (Matrix Nat Nat n n a) Source # 
(KnownNat n, Semiring a) => MultiplicativeUnital (Matrix Nat Nat n n a) Source # 

Methods

one :: Matrix Nat Nat n n a Source #

(KnownNat n, Semiring a) => MultiplicativeMagma (Matrix Nat Nat n n a) Source # 

Methods

times :: Matrix Nat Nat n n a -> Matrix Nat Nat n n a -> Matrix Nat Nat n n a Source #

(KnownNat n, Semiring a) => Distribution (Matrix Nat Nat n n a) Source # 
(KnownNat n, AdditiveGroup a, Semiring a) => Ring (Matrix Nat Nat n n a) Source # 
(KnownNat n, Semiring a) => Semiring (Matrix Nat Nat n n a) Source # 
(Eq a, Fractional a, BoundedField a, KnownNat n, AdditiveGroup a, Semiring a) => Semifield (Matrix Nat Nat n n a) Source # 
(KnownNat m, KnownNat n, Epsilon a) => Epsilon (Matrix Nat Nat m n a) Source # 
type Rep (Matrix Nat Nat m n) Source # 
type Rep (Matrix Nat Nat m n) = (Int, Int)
type Shape (Matrix Nat Nat m n) Source # 
type Shape (Matrix Nat Nat m n) = (Int, Int)
type Item (Matrix Nat Nat m n a) Source # 
type Item (Matrix Nat Nat m n a) = a

data SomeMatrix a Source #

a two-dimensional array where shape is specified at the value level as a '(Int,Int)' Use this to avoid type-level hasochism by demoting a Matrix with someMatrix

Constructors

SomeMatrix (Int, Int) (Vector a) 

Instances

Functor SomeMatrix Source # 

Methods

fmap :: (a -> b) -> SomeMatrix a -> SomeMatrix b #

(<$) :: a -> SomeMatrix b -> SomeMatrix a #

Foldable SomeMatrix Source # 

Methods

fold :: Monoid m => SomeMatrix m -> m #

foldMap :: Monoid m => (a -> m) -> SomeMatrix a -> m #

foldr :: (a -> b -> b) -> b -> SomeMatrix a -> b #

foldr' :: (a -> b -> b) -> b -> SomeMatrix a -> b #

foldl :: (b -> a -> b) -> b -> SomeMatrix a -> b #

foldl' :: (b -> a -> b) -> b -> SomeMatrix a -> b #

foldr1 :: (a -> a -> a) -> SomeMatrix a -> a #

foldl1 :: (a -> a -> a) -> SomeMatrix a -> a #

toList :: SomeMatrix a -> [a] #

null :: SomeMatrix a -> Bool #

length :: SomeMatrix a -> Int #

elem :: Eq a => a -> SomeMatrix a -> Bool #

maximum :: Ord a => SomeMatrix a -> a #

minimum :: Ord a => SomeMatrix a -> a #

sum :: Num a => SomeMatrix a -> a #

product :: Num a => SomeMatrix a -> a #

HasShape SomeMatrix Source # 

Associated Types

type Shape (SomeMatrix :: * -> *) :: * Source #

IsList (SomeMatrix a) Source #

from nested list

Associated Types

type Item (SomeMatrix a) :: * #

Eq a => Eq (SomeMatrix a) Source # 

Methods

(==) :: SomeMatrix a -> SomeMatrix a -> Bool #

(/=) :: SomeMatrix a -> SomeMatrix a -> Bool #

Show a => Show (SomeMatrix a) Source # 
Arbitrary a => Arbitrary (SomeMatrix a) Source # 
type Shape SomeMatrix Source # 
type Item (SomeMatrix a) Source # 
type Item (SomeMatrix a) = [a]

Conversion

someMatrix :: (KnownNat m, KnownNat n) => Matrix (m :: Nat) (n :: Nat) a -> SomeMatrix a Source #

convert from a Matrix to a SomeMatrix

unsafeToMatrix :: SomeMatrix a -> Matrix (m :: Nat) (n :: Nat) a Source #

convert from a SomeMatrix to a Matrix with no shape check

toMatrix :: forall a m n. (KnownNat m, KnownNat n) => SomeMatrix a -> Maybe (Matrix (m :: Nat) (n :: Nat) a) Source #

convert from a SomeMatrix to a Matrix, checking shape

unsafeFromVV :: forall a m n. Vector m (Vector n a) -> Matrix m n a Source #

conversion from a double Vector representation

toVV :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Vector m (Vector n a) Source #

conversion to a double Vector representation

toCol :: forall a n. Vector n a -> Matrix 1 n a Source #

convert a Vector to a column Matrix

toRow :: forall a m. Vector m a -> Matrix m 1 a Source #

convert a Vector to a row Matrix

fromCol :: forall a n. Matrix 1 n a -> Vector n a Source #

convert a row Matrix to a Vector

fromRow :: forall a m. Matrix m 1 a -> Vector m a Source #

convert a column Matrix to a Vector

col :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Int -> Vector m a Source #

extract a column from a Matrix as a Vector

row :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Int -> Vector n a Source #

extract a row from a Matrix as a Vector

joinc :: forall m n0 n1 a. (KnownNat m, KnownNat n0, KnownNat n1, Representable (Matrix m (n0 :+ n1))) => Matrix m n0 a -> Matrix m n1 a -> Matrix m (n0 :+ n1) a Source #

join column-wise

joinr :: forall m0 m1 n a. (KnownNat m0, KnownNat m1, KnownNat n, Representable (Matrix (m0 :+ m1) n)) => Matrix m0 n a -> Matrix m1 n a -> Matrix (m0 :+ m1) n a Source #

join row-wise

resize :: forall m0 m1 n0 n1 a. (KnownNat m0, KnownNat m1, KnownNat n0, KnownNat n1, AdditiveUnital a) => Matrix m0 n0 a -> Matrix m1 n1 a Source #

resize matrix, appending with zero if needed

reshape :: forall m0 m1 n0 n1 a. (KnownNat m0, KnownNat m1, KnownNat n0, KnownNat n1, AdditiveUnital a) => Matrix m0 n0 a -> Matrix m1 n1 a Source #

reshape matrix, appending with zero if needed

Operations

mmult :: forall m n k a. (Hilbert (Vector k) a, KnownNat m, KnownNat n, KnownNat k) => Matrix m k a -> Matrix k n a -> Matrix m n a Source #

matrix multiplication

trans :: forall m n a. (KnownNat m, KnownNat n) => Matrix m n a -> Matrix n m a Source #

matrix transposition

trans . trans == identity

getDiag :: forall n a. KnownNat n => Matrix n n a -> Vector n a Source #

extract the matrix diagonal as a vector

getDiag one == one

diagonal :: forall n a. (KnownNat n, AdditiveUnital a) => Vector n a -> Matrix n n a Source #

create a matrix using a vector as the diagonal

diagonal one = one
getDiag . diagonal == identity

mapc :: forall m n a. (KnownNat m, KnownNat n) => (Vector m a -> Vector m a) -> Matrix m n a -> Matrix m n a Source #

map a homomorphic vector function, column-wise

mapr :: forall m n a. (KnownNat m, KnownNat n) => (Vector n a -> Vector n a) -> Matrix m n a -> Matrix m n a Source #

map a homomorphic vector function, row-wise

Arbitrary

newtype ShapeM Source #

used to get sensible arbitrary instances of SomeMatrix

Constructors

ShapeM 

Fields