diff options
Diffstat (limited to 'lib/Data/Packed/Matrix.hs')
-rw-r--r-- | lib/Data/Packed/Matrix.hs | 53 |
1 files changed, 50 insertions, 3 deletions
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs index 4f2ad90..5a4b919 100644 --- a/lib/Data/Packed/Matrix.hs +++ b/lib/Data/Packed/Matrix.hs | |||
@@ -1,3 +1,4 @@ | |||
1 | {-# OPTIONS_GHC -fglasgow-exts #-} | ||
1 | ----------------------------------------------------------------------------- | 2 | ----------------------------------------------------------------------------- |
2 | -- | | 3 | -- | |
3 | -- Module : Data.Packed.Matrix | 4 | -- Module : Data.Packed.Matrix |
@@ -21,17 +22,21 @@ module Data.Packed.Matrix ( | |||
21 | trans, conjTrans, | 22 | trans, conjTrans, |
22 | asRow, asColumn, | 23 | asRow, asColumn, |
23 | fromRows, toRows, fromColumns, toColumns, | 24 | fromRows, toRows, fromColumns, toColumns, |
24 | fromBlocks, joinVert, joinHoriz, | 25 | fromBlocks, |
25 | flipud, fliprl, | 26 | flipud, fliprl, |
26 | subMatrix, takeRows, dropRows, takeColumns, dropColumns, | 27 | subMatrix, takeRows, dropRows, takeColumns, dropColumns, |
27 | ident, diag, diagRect, takeDiag, | 28 | ident, diag, diagRect, takeDiag, |
28 | liftMatrix, liftMatrix2, | 29 | liftMatrix, liftMatrix2, |
30 | dispR, readMatrix, fromArray2D | ||
29 | ) where | 31 | ) where |
30 | 32 | ||
31 | import Data.Packed.Internal | 33 | import Data.Packed.Internal |
32 | import Foreign(Storable) | 34 | import Foreign(Storable) |
33 | import Complex | 35 | import Complex |
34 | import Data.Packed.Vector | 36 | import Data.Packed.Vector |
37 | import Numeric(showGFloat) | ||
38 | import Data.List(transpose,intersperse) | ||
39 | import Data.Array | ||
35 | 40 | ||
36 | -- | creates a matrix from a vertical list of matrices | 41 | -- | creates a matrix from a vertical list of matrices |
37 | joinVert :: Field t => [Matrix t] -> Matrix t | 42 | joinVert :: Field t => [Matrix t] -> Matrix t |
@@ -160,5 +165,47 @@ asRow v = reshape (dim v) v | |||
160 | asColumn :: Field a => Vector a -> Matrix a | 165 | asColumn :: Field a => Vector a -> Matrix a |
161 | asColumn v = reshape 1 v | 166 | asColumn v = reshape 1 v |
162 | 167 | ||
163 | ------------------------------------------------ | 168 | ----------------------------------------------------- |
164 | 169 | ||
170 | fromArray2D :: (Field e) => Array (Int, Int) e -> Matrix e | ||
171 | fromArray2D m = (r><c) (elems m) | ||
172 | where ((r0,c0),(r1,c1)) = bounds m | ||
173 | r = r1-r0+1 | ||
174 | c = c1-c0+1 | ||
175 | |||
176 | ------------------------------------------------------ | ||
177 | -- shows a Double with n digits after the decimal point | ||
178 | shf :: (RealFloat a) => Int -> a -> String | ||
179 | shf dec n | abs n < 1e-10 = "0." | ||
180 | | abs (n - (fromIntegral.round $ n)) < 1e-10 = show (round n) ++"." | ||
181 | | otherwise = showGFloat (Just dec) n "" | ||
182 | -- shows a Complex Double as a pair, with n digits after the decimal point | ||
183 | shfc n z@ (a:+b) | ||
184 | | magnitude z <1e-10 = "0." | ||
185 | | abs b < 1e-10 = shf n a | ||
186 | | abs a < 1e-10 = shf n b ++"i" | ||
187 | | b > 0 = shf n a ++"+"++shf n b ++"i" | ||
188 | | otherwise = shf n a ++shf n b ++"i" | ||
189 | |||
190 | dsp' :: String -> [[String]] -> String | ||
191 | dsp' sep as = unlines . map unwords' $ transpose mtp where | ||
192 | mt = transpose as | ||
193 | longs = map (maximum . map length) mt | ||
194 | mtp = zipWith (\a b -> map (pad a) b) longs mt | ||
195 | pad n str = replicate (n - length str) ' ' ++ str | ||
196 | unwords' = concat . intersperse sep | ||
197 | |||
198 | format :: (Field t) => String -> (t -> String) -> Matrix t -> String | ||
199 | format sep f m = dsp' sep . map (map f) . toLists $ m | ||
200 | |||
201 | disp m f = putStrLn $ "matrix ("++show (rows m) ++"x"++ show (cols m) ++")\n"++format " | " f m | ||
202 | |||
203 | dispR :: Int -> Matrix Double -> IO () | ||
204 | dispR d m = disp m (shf d) | ||
205 | |||
206 | dispC :: Int -> Matrix (Complex Double) -> IO () | ||
207 | dispC d m = disp m (shfc d) | ||
208 | |||
209 | -- | creates a matrix from a table of numbers. | ||
210 | readMatrix :: String -> Matrix Double | ||
211 | readMatrix = fromLists . map (map read). map words . filter (not.null) . lines | ||