easytensor-0.2.0.0: src/Numeric/Matrix.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
-----------------------------------------------------------------------------
-- |
-- Module : Numeric.Matrix
-- Copyright : (c) Artem Chirkin
-- License : BSD3
--
-- Maintainer : chirkin@arch.ethz.ch
--
--
-----------------------------------------------------------------------------
module Numeric.Matrix
( MatrixCalculus (..)
, SquareMatrixCalculus (..)
, MatrixInverse (..)
, Matrix
, Mat22f, Mat23f, Mat24f
, Mat32f, Mat33f, Mat34f
, Mat42f, Mat43f, Mat44f
, mat22, mat33, mat44
, (%*)
) where
import GHC.Types (Type)
import Numeric.Commons
import Numeric.DataFrame.Contraction ((%*))
import Numeric.DataFrame.Shape
import Numeric.Dimensions (Nat)
import Numeric.Matrix.Type
import Numeric.Vector
import Control.Monad.ST
import Numeric.DataFrame.ST
-- Type abbreviations
type Mat22f = Matrix Float 2 2
type Mat32f = Matrix Float 3 2
type Mat42f = Matrix Float 4 2
type Mat23f = Matrix Float 2 3
type Mat33f = Matrix Float 3 3
type Mat43f = Matrix Float 4 3
type Mat24f = Matrix Float 2 4
type Mat34f = Matrix Float 3 4
type Mat44f = Matrix Float 4 4
-- | Compose a 2x2D matrix
mat22 :: ( PrimBytes (Vector t 2)
, PrimBytes (Matrix t 2 2)
)
=> Vector t 2 -> Vector t 2 -> Matrix t 2 2
mat22 = (<::>)
-- | Compose a 3x3D matrix
mat33 :: ( PrimBytes t
, PrimBytes (Vector t 3)
, PrimBytes (Matrix t 3 3)
)
=> Vector t 3 -> Vector t 3 -> Vector t 3 -> Matrix t 3 3
mat33 a b c = runST $ do
mmat <- newDataFrame
copyDataFrame a 1 mmat
copyDataFrame b 2 mmat
copyDataFrame c 3 mmat
unsafeFreezeDataFrame mmat
-- | Compose a 4x4D matrix
mat44 :: forall (t :: Type)
. ( PrimBytes t
, PrimBytes (Vector t (4 :: Nat))
, PrimBytes (Matrix t (4 :: Nat) (4 :: Nat))
)
=> Vector t (4 :: Nat) -> Vector t (4 :: Nat) -> Vector t (4 :: Nat) -> Vector t (4 :: Nat)
-> Matrix t (4 :: Nat) (4 :: Nat)
mat44 a b c d = runST $ do
mmat <- newDataFrame
copyDataFrame a 1 mmat
copyDataFrame b 2 mmat
copyDataFrame c 3 mmat
copyDataFrame d 4 mmat
unsafeFreezeDataFrame mmat