diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Data/Packed/Matrix.hs | 40 | ||||
-rw-r--r-- | lib/Data/Packed/Vector.hs | 4 | ||||
-rw-r--r-- | lib/Numeric/LinearAlgebra/Tests.hs | 11 |
3 files changed, 54 insertions, 1 deletions
diff --git a/lib/Data/Packed/Matrix.hs b/lib/Data/Packed/Matrix.hs index 6a6942d..7e197d1 100644 --- a/lib/Data/Packed/Matrix.hs +++ b/lib/Data/Packed/Matrix.hs | |||
@@ -29,7 +29,7 @@ module Data.Packed.Matrix ( | |||
29 | extractRows, | 29 | extractRows, |
30 | ident, diag, diagRect, takeDiag, | 30 | ident, diag, diagRect, takeDiag, |
31 | liftMatrix, liftMatrix2, | 31 | liftMatrix, liftMatrix2, |
32 | format, | 32 | format, dispf, disps, vecdisp, |
33 | loadMatrix, saveMatrix, fromFile, fileDimensions, | 33 | loadMatrix, saveMatrix, fromFile, fileDimensions, |
34 | readMatrix, fromArray2D | 34 | readMatrix, fromArray2D |
35 | ) where | 35 | ) where |
@@ -40,6 +40,7 @@ import Data.Packed.Vector | |||
40 | import Data.List(transpose,intersperse) | 40 | import Data.List(transpose,intersperse) |
41 | import Data.Array | 41 | import Data.Array |
42 | import System.Process(readProcess) | 42 | import System.Process(readProcess) |
43 | import Text.Printf(printf) | ||
43 | 44 | ||
44 | -- | creates a matrix from a vertical list of matrices | 45 | -- | creates a matrix from a vertical list of matrices |
45 | joinVert :: Element t => [Matrix t] -> Matrix t | 46 | joinVert :: Element t => [Matrix t] -> Matrix t |
@@ -245,6 +246,43 @@ dispC :: Int -> Matrix (Complex Double) -> IO () | |||
245 | dispC d m = disp m (shfc d) | 246 | dispC d m = disp m (shfc d) |
246 | -} | 247 | -} |
247 | 248 | ||
249 | ------------------------------------------------------------------- | ||
250 | -- display utilities | ||
251 | |||
252 | -- | Print a matrix with \"autoscaling\" and a given number of decimal places. | ||
253 | disps :: Int -> Matrix Double -> String | ||
254 | disps d x = sdims x ++ " " ++ formatScaled d x | ||
255 | |||
256 | -- | Print a matrix with a given number of decimal places. | ||
257 | dispf :: Int -> Matrix Double -> String | ||
258 | dispf d x = sdims x ++ "\n" ++ formatFixed (if isInt x then 0 else d) x | ||
259 | |||
260 | sdims x = show (rows x) ++ "x" ++ show (cols x) | ||
261 | |||
262 | formatFixed d x = format " " (printf ("%."++show d++"f")) $ x | ||
263 | |||
264 | isInt = all lookslikeInt . toList . flatten where | ||
265 | lookslikeInt x = show (round x :: Int) ++".0" == shx || "-0.0" == shx | ||
266 | where shx = show x | ||
267 | |||
268 | formatScaled dec t = "E"++show o++"\n" ++ ss | ||
269 | where ss = format " " (printf fmt. g) t | ||
270 | g x | o >= 0 = x/10^(o::Int) | ||
271 | | otherwise = x*10^(-o) | ||
272 | o = floor $ maximum $ map (logBase 10 . abs) $ toList $ flatten t | ||
273 | fmt = '%':show (dec+3) ++ '.':show dec ++"f" | ||
274 | |||
275 | -- | Print a vector using a function for printing matrices. | ||
276 | vecdisp :: (Element t) => (Matrix t -> String) -> Vector t -> String | ||
277 | vecdisp f v | ||
278 | = ((show (dim v) ++ " |> ") ++) . (++"\n") | ||
279 | . unwords . lines . tail . dropWhile (not . (`elem` " \n")) | ||
280 | . f . trans . reshape 1 | ||
281 | $ v | ||
282 | |||
283 | |||
284 | -------------------------------------------------------------------- | ||
285 | |||
248 | -- | reads a matrix from a string containing a table of numbers. | 286 | -- | reads a matrix from a string containing a table of numbers. |
249 | readMatrix :: String -> Matrix Double | 287 | readMatrix :: String -> Matrix Double |
250 | readMatrix = fromLists . map (map read). map words . filter (not.null) . lines | 288 | readMatrix = fromLists . map (map read). map words . filter (not.null) . lines |
diff --git a/lib/Data/Packed/Vector.hs b/lib/Data/Packed/Vector.hs index 457da71..ed0e49c 100644 --- a/lib/Data/Packed/Vector.hs +++ b/lib/Data/Packed/Vector.hs | |||
@@ -32,6 +32,10 @@ import Numeric.GSL.Vector | |||
32 | 32 | ||
33 | @\> linspace 5 (-3,7) | 33 | @\> linspace 5 (-3,7) |
34 | 5 |> [-3.0,-0.5,2.0,4.5,7.0]@ | 34 | 5 |> [-3.0,-0.5,2.0,4.5,7.0]@ |
35 | |||
36 | Logarithmic spacing can be defined as follows: | ||
37 | |||
38 | @logspace n (a,b) = 10 ** linspace n (a,b)@ | ||
35 | -} | 39 | -} |
36 | linspace :: Int -> (Double, Double) -> Vector Double | 40 | linspace :: Int -> (Double, Double) -> Vector Double |
37 | linspace n (a,b) = add a $ scale s $ fromList [0 .. fromIntegral n-1] | 41 | linspace n (a,b) = add a $ scale s $ fromList [0 .. fromIntegral n-1] |
diff --git a/lib/Numeric/LinearAlgebra/Tests.hs b/lib/Numeric/LinearAlgebra/Tests.hs index 9557ac3..063ae86 100644 --- a/lib/Numeric/LinearAlgebra/Tests.hs +++ b/lib/Numeric/LinearAlgebra/Tests.hs | |||
@@ -321,6 +321,8 @@ manymult n = foldl1' (<>) (map rot2 angles) where | |||
321 | where c = cos a | 321 | where c = cos a |
322 | s = sin a | 322 | s = sin a |
323 | 323 | ||
324 | multb n = foldl1' (<>) (replicate (10^6) (ident n :: Matrix Double)) | ||
325 | |||
324 | -------------------------------- | 326 | -------------------------------- |
325 | 327 | ||
326 | multBench = do | 328 | multBench = do |
@@ -328,6 +330,15 @@ multBench = do | |||
328 | let b = ident 2000 :: Matrix Double | 330 | let b = ident 2000 :: Matrix Double |
329 | a `seq` b `seq` putStrLn "" | 331 | a `seq` b `seq` putStrLn "" |
330 | time "product of 1M different 3x3 matrices" (manymult (10^6)) | 332 | time "product of 1M different 3x3 matrices" (manymult (10^6)) |
333 | putStrLn "" | ||
334 | time "product of 1M constant 1x1 matrices" (multb 1) | ||
335 | time "product of 1M constant 3x3 matrices" (multb 3) | ||
336 | --time "product of 1M constant 5x5 matrices" (multb 5) | ||
337 | time "product of 1M const. 10x10 matrices" (multb 10) | ||
338 | --time "product of 1M const. 15x15 matrices" (multb 15) | ||
339 | time "product of 1M const. 20x20 matrices" (multb 20) | ||
340 | --time "product of 1M const. 25x25 matrices" (multb 25) | ||
341 | putStrLn "" | ||
331 | time "product (1000 x 1000)<>(1000 x 1000)" (a<>a) | 342 | time "product (1000 x 1000)<>(1000 x 1000)" (a<>a) |
332 | time "product (2000 x 2000)<>(2000 x 2000)" (b<>b) | 343 | time "product (2000 x 2000)<>(2000 x 2000)" (b<>b) |
333 | 344 | ||