{-# 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