diff options
author | Alberto Ruiz <aruiz@um.es> | 2007-05-28 12:22:24 +0000 |
---|---|---|
committer | Alberto Ruiz <aruiz@um.es> | 2007-05-28 12:22:24 +0000 |
commit | 80673221e704b451e0d9468d6dfe1a38ad676c07 (patch) | |
tree | 1cba10d54d457ebfda1ec7810149664818834027 /lib/Data/Packed/Internal.hs | |
parent | c3a1c3ed7c1be6f255ff3bd4f8ec6d2dd2a29b66 (diff) |
common trans
Diffstat (limited to 'lib/Data/Packed/Internal.hs')
-rw-r--r-- | lib/Data/Packed/Internal.hs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Data/Packed/Internal.hs b/lib/Data/Packed/Internal.hs index c8ad8d7..5e19e58 100644 --- a/lib/Data/Packed/Internal.hs +++ b/lib/Data/Packed/Internal.hs | |||
@@ -67,6 +67,15 @@ infixl 0 // | |||
67 | vec :: Vector a -> (Int -> Ptr b -> t) -> t | 67 | vec :: Vector a -> (Int -> Ptr b -> t) -> t |
68 | vec v f = f (dim v) (castPtr $ ptr v) | 68 | vec v f = f (dim v) (castPtr $ ptr v) |
69 | 69 | ||
70 | mata :: Matrix a -> (Int-> Int -> Ptr b -> t) -> t | ||
71 | mata m f = f (rows m) (cols m) (castPtr $ ptr (mat m)) | ||
72 | |||
73 | pd2pc :: Ptr Double -> Ptr (Complex (Double)) | ||
74 | pd2pc = castPtr | ||
75 | |||
76 | pc2pd :: Ptr (Complex (Double)) -> Ptr Double | ||
77 | pc2pd = castPtr | ||
78 | |||
70 | check msg ls f = do | 79 | check msg ls f = do |
71 | err <- f | 80 | err <- f |
72 | when (err/=0) (error msg) | 81 | when (err/=0) (error msg) |
@@ -97,6 +106,9 @@ at :: Storable a => Vector a -> Int -> a | |||
97 | at v n | n >= 0 && n < dim v = at' v n | 106 | at v n | n >= 0 && n < dim v = at' v n |
98 | | otherwise = error "vector index out of range" | 107 | | otherwise = error "vector index out of range" |
99 | 108 | ||
109 | dsv v = sizeOf (v `at` 0) | ||
110 | dsm m = (dsv.mat) m | ||
111 | |||
100 | constant :: Storable a => Int -> a -> Vector a | 112 | constant :: Storable a => Int -> a -> Vector a |
101 | constant n x = unsafePerformIO $ do | 113 | constant n x = unsafePerformIO $ do |
102 | v <- createVector n | 114 | v <- createVector n |
@@ -118,3 +130,18 @@ reshape n v = M { rows = dim v `div` n | |||
118 | , trMode = NoTrans | 130 | , trMode = NoTrans |
119 | , isCOrder = True | 131 | , isCOrder = True |
120 | } | 132 | } |
133 | |||
134 | createMatrix r c = do | ||
135 | p <- createVector (r*c) | ||
136 | return (reshape c p) | ||
137 | |||
138 | type CMat s = Int -> Int -> Ptr Double -> s | ||
139 | type CVec s = Int -> Ptr Double -> s | ||
140 | |||
141 | foreign import ccall safe "aux.h trans" ctrans :: Int -> CMat (CMat (IO Int)) | ||
142 | |||
143 | trans :: Storable a => Matrix a -> Matrix a | ||
144 | trans m = unsafePerformIO $ do | ||
145 | r <- createMatrix (cols m) (rows m) | ||
146 | ctrans (dsm m) // mata m // mata r // check "trans" [mat m] | ||
147 | return r | ||