module Data.Matrix.Dense.Class.Creating (
newMatrix_,
newMatrix,
newListMatrix,
newRowsMatrix,
newColsMatrix,
newRowMatrix,
newColMatrix,
unsafeNewMatrix,
) where
import Control.Monad( forM_ )
import Foreign( pokeArray )
import BLAS.Elem
import BLAS.UnsafeIOToM
import Data.Vector.Dense.Class
import Data.Matrix.Dense.Class.Internal
newMatrix :: (WriteMatrix a x m, Elem e) =>
(Int,Int) -> [((Int,Int), e)] -> m (a mn e)
newMatrix = newMatrixHelp writeElem
unsafeNewMatrix :: (WriteMatrix a x m, Elem e) =>
(Int,Int) -> [((Int,Int), e)] -> m (a mn e)
unsafeNewMatrix = newMatrixHelp unsafeWriteElem
newMatrixHelp :: (WriteMatrix a x m, Elem e) =>
(a mn e -> (Int,Int) -> e -> m ()) -> (Int,Int) -> [((Int,Int),e)] -> m (a mn e)
newMatrixHelp set n ies = do
a <- newZeroMatrix n
mapM_ (uncurry $ set a) ies
return a
newListMatrix :: (WriteMatrix a x m, Elem e) => (Int,Int) -> [e] -> m (a mn e)
newListMatrix (m,n) es = do
a <- newZeroMatrix (m,n)
unsafeIOToM $ withMatrixPtr a $ flip pokeArray (take (m*n) es)
return a
newColsMatrix :: (ReadVector x m, WriteMatrix a y m, BLAS1 e) =>
(Int,Int) -> [x k e] -> m (a (k,l) e)
newColsMatrix (m,n) cs = do
a <- newZeroMatrix (m,n)
forM_ (zip [0..(n1)] cs) $ \(j,c) ->
copyVector (unsafeColView a j) c
return a
newRowsMatrix :: (ReadVector x m, WriteMatrix a y m, BLAS1 e) =>
(Int,Int) -> [x l e] -> m (a (k,l) e)
newRowsMatrix (m,n) rs = do
a <- newZeroMatrix (m,n)
forM_ (zip [0..(m1)] rs) $ \(i,r) ->
copyVector (unsafeRowView a i) r
return a
newColMatrix :: (ReadVector x m, WriteMatrix a y m, BLAS1 e) =>
x k e -> m (a (k,one) e)
newColMatrix x = newColsMatrix (dim x,1) [x]
newRowMatrix :: (ReadVector x m, WriteMatrix a y m, BLAS1 e) =>
x l e -> m (a (one,l) e)
newRowMatrix x = newRowsMatrix (1,dim x) [x]