From 21e13ae0a13befb5cb8feb7c52bcd4b4e4cda953 Mon Sep 17 00:00:00 2001 From: Alberto Ruiz Date: Wed, 5 Nov 2008 11:02:45 +0000 Subject: diag using ST --- lib/Data/Packed/Internal/Common.hs | 8 -------- lib/Data/Packed/Internal/Matrix.hs | 25 ------------------------- lib/Data/Packed/Internal/auxi.c | 26 -------------------------- lib/Data/Packed/Internal/auxi.h | 3 --- lib/Data/Packed/Matrix.hs | 11 ++++++++++- 5 files changed, 10 insertions(+), 63 deletions(-) (limited to 'lib/Data') diff --git a/lib/Data/Packed/Internal/Common.hs b/lib/Data/Packed/Internal/Common.hs index bce9922..1b63dd8 100644 --- a/lib/Data/Packed/Internal/Common.hs +++ b/lib/Data/Packed/Internal/Common.hs @@ -100,9 +100,6 @@ check msg f = do -- | description of GSL error codes foreign import ccall "auxi.h gsl_strerror" gsl_strerror :: CInt -> IO (Ptr CChar) ---------------------------------------------------- --- ugly, but my haddock version doesn't understand --- yet infix type constructors --------------------------------------------------- ---------- signatures of the C functions --------- -------------------------------------------------- @@ -141,8 +138,3 @@ type TCVM = CInt -> PC -> TM -- type TMCVM = CInt -> CInt -> PD -> TCVM -- type TMMCVM = CInt -> CInt -> PD -> TMCVM -- -------------------------------------------------- - -type TauxMul a = CInt -> CInt -> CInt -> Ptr a - -> CInt -> CInt -> CInt -> Ptr a - -> CInt -> CInt -> Ptr a - -> IO CInt diff --git a/lib/Data/Packed/Internal/Matrix.hs b/lib/Data/Packed/Internal/Matrix.hs index 63f0a8d..51fb6f8 100644 --- a/lib/Data/Packed/Internal/Matrix.hs +++ b/lib/Data/Packed/Internal/Matrix.hs @@ -213,19 +213,16 @@ class (Storable a, Floating a) => Element a where subMatrixD :: (Int,Int) -- ^ (r0,c0) starting position -> (Int,Int) -- ^ (rt,ct) dimensions of submatrix -> Matrix a -> Matrix a - diagD :: Vector a -> Matrix a instance Element Double where constantD = constantR transdata = transdataR subMatrixD = subMatrixR - diagD = diagR instance Element (Complex Double) where constantD = constantC transdata = transdataC subMatrixD = subMatrixC - diagD = diagC ------------------------------------------------------------------ @@ -287,28 +284,6 @@ subMatrix :: Element a -> Matrix a -- ^ result subMatrix = subMatrixD - ---------------------------------------------------------------------- - -diagAux fun msg (v@V {dim = n}) = unsafePerformIO $ do - m <- createMatrix RowMajor n n - app2 fun vec v mat m msg - return m - --- | diagonal matrix from a real vector -diagR :: Vector Double -> Matrix Double -diagR = diagAux c_diagR "diagR" -foreign import ccall "auxi.h diagR" c_diagR :: TVM - --- | diagonal matrix from a real vector -diagC :: Vector (Complex Double) -> Matrix (Complex Double) -diagC = diagAux c_diagC "diagC" -foreign import ccall "auxi.h diagC" c_diagC :: TCVCM - --- | creates a square matrix with the given diagonal -diag :: Element a => Vector a -> Matrix a -diag = diagD - ------------------------------------------------------------------------ constantAux fun x n = unsafePerformIO $ do diff --git a/lib/Data/Packed/Internal/auxi.c b/lib/Data/Packed/Internal/auxi.c index bbb8cd4..c449b9a 100644 --- a/lib/Data/Packed/Internal/auxi.c +++ b/lib/Data/Packed/Internal/auxi.c @@ -113,32 +113,6 @@ int constantC(gsl_complex* pval, CVEC(r)) { } -int diagR(KRVEC(d),RMAT(r)) { - REQUIRES(dn==rr && rr==rc,BAD_SIZE); - DEBUGMSG("diagR"); - int i,j; - for (i=0;i Vector a -> Matrix a +diag v = ST.runSTMatrix $ do + let d = dim v + m <- ST.newMatrix 0 d d + mapM_ (\k -> ST.writeMatrix m k k (v@>k)) [0..d-1] + return m + {- | creates a rectangular diagonal matrix @> diagRect (constant 5 3) 3 4 @@ -87,7 +96,7 @@ diagRect s r c | r == c = diag s | r < c = trans $ diagRect s c r | otherwise = joinVert [diag s , zeros (r-c,c)] - where zeros (r',c') = reshape c' $ constantD 0 (r'*c') + where zeros (r',c') = reshape c' $ constant 0 (r'*c') -- | extracts the diagonal from a rectangular matrix takeDiag :: (Element t) => Matrix t -> Vector t -- cgit v1.2.3