summaryrefslogtreecommitdiff
path: root/lib/Data/Packed/Internal.hs
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Data/Packed/Internal.hs')
-rw-r--r--lib/Data/Packed/Internal.hs27
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 //
67vec :: Vector a -> (Int -> Ptr b -> t) -> t 67vec :: Vector a -> (Int -> Ptr b -> t) -> t
68vec v f = f (dim v) (castPtr $ ptr v) 68vec v f = f (dim v) (castPtr $ ptr v)
69 69
70mata :: Matrix a -> (Int-> Int -> Ptr b -> t) -> t
71mata m f = f (rows m) (cols m) (castPtr $ ptr (mat m))
72
73pd2pc :: Ptr Double -> Ptr (Complex (Double))
74pd2pc = castPtr
75
76pc2pd :: Ptr (Complex (Double)) -> Ptr Double
77pc2pd = castPtr
78
70check msg ls f = do 79check 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
97at v n | n >= 0 && n < dim v = at' v n 106at 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
109dsv v = sizeOf (v `at` 0)
110dsm m = (dsv.mat) m
111
100constant :: Storable a => Int -> a -> Vector a 112constant :: Storable a => Int -> a -> Vector a
101constant n x = unsafePerformIO $ do 113constant 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
134createMatrix r c = do
135 p <- createVector (r*c)
136 return (reshape c p)
137
138type CMat s = Int -> Int -> Ptr Double -> s
139type CVec s = Int -> Ptr Double -> s
140
141foreign import ccall safe "aux.h trans" ctrans :: Int -> CMat (CMat (IO Int))
142
143trans :: Storable a => Matrix a -> Matrix a
144trans 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