Safe Haskell | None |
---|---|
Language | Haskell2010 |
Two-dimensional arrays. Two classes are supplied
Matrix
where shape information is held at type level, andSomeMatrix
where shape is held at the value level.
In both cases, the underlying data is contained as a flat vector for efficiency purposes.
- newtype Matrix m n a = Matrix {
- flattenMatrix :: Vector a
- data SomeMatrix a = SomeMatrix (Int, Int) (Vector a)
- someMatrix :: (KnownNat m, KnownNat n) => Matrix (m :: Nat) (n :: Nat) a -> SomeMatrix a
- unsafeToMatrix :: SomeMatrix a -> Matrix (m :: Nat) (n :: Nat) a
- toMatrix :: forall a m n. (KnownNat m, KnownNat n) => SomeMatrix a -> Maybe (Matrix (m :: Nat) (n :: Nat) a)
- unsafeFromVV :: forall a m n. Vector m (Vector n a) -> Matrix m n a
- toVV :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Vector m (Vector n a)
- toCol :: forall a n. Vector n a -> Matrix 1 n a
- toRow :: forall a m. Vector m a -> Matrix m 1 a
- fromCol :: forall a n. Matrix 1 n a -> Vector n a
- fromRow :: forall a m. Matrix m 1 a -> Vector m a
- col :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Int -> Vector m a
- row :: forall a m n. (KnownNat m, KnownNat n) => Matrix m n a -> Int -> Vector n a
- 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
- 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
- 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
- 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
- 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
- trans :: forall m n a. (KnownNat m, KnownNat n) => Matrix m n a -> Matrix n m a
- getDiag :: forall n a. KnownNat n => Matrix n n a -> Vector n a
- diagonal :: forall n a. (KnownNat n, AdditiveUnital a) => Vector n a -> Matrix n n a
- mapc :: forall m n a. (KnownNat m, KnownNat n) => (Vector m a -> Vector m a) -> Matrix m n a -> Matrix m n a
- mapr :: forall m n a. (KnownNat m, KnownNat n) => (Vector n a -> Vector n a) -> Matrix m n a -> Matrix m n a
- newtype ShapeM = ShapeM {}
Documentation
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.
Matrix | |
|
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
SomeMatrix (Int, Int) (Vector a) |
Functor SomeMatrix Source # | |
Foldable SomeMatrix Source # | |
HasShape SomeMatrix Source # | |
IsList (SomeMatrix a) Source # | from nested list |
Eq a => Eq (SomeMatrix a) Source # | |
Show a => Show (SomeMatrix a) Source # | |
Arbitrary a => Arbitrary (SomeMatrix a) Source # | |
type Shape SomeMatrix Source # | |
type Item (SomeMatrix a) Source # | |
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
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