From a4250d0887462b123aa4d2a3d21dddc323ee4ee1 Mon Sep 17 00:00:00 2001 From: Alberto Ruiz Date: Thu, 28 May 2015 11:53:11 +0200 Subject: general Range, test --- packages/base/src/Data/Packed/Internal/Numeric.hs | 15 +++++++++------ packages/base/src/Numeric/LinearAlgebra/Util.hs | 10 +++++++++- 2 files changed, 18 insertions(+), 7 deletions(-) (limited to 'packages/base') diff --git a/packages/base/src/Data/Packed/Internal/Numeric.hs b/packages/base/src/Data/Packed/Internal/Numeric.hs index 67d047c..44d18b3 100644 --- a/packages/base/src/Data/Packed/Internal/Numeric.hs +++ b/packages/base/src/Data/Packed/Internal/Numeric.hs @@ -69,7 +69,7 @@ type instance ArgOf Matrix a = a -> a -> a data Extractor = All - | Range Int Int + | Range Int Int Int | Pos (Vector I) | PosCyc (Vector I) | Take Int @@ -89,16 +89,19 @@ infixl 9 ?? extractError m e = error $ printf "can't extract %s from matrix %dx%d" (show e) (rows m) (cols m) -m ?? e@(Range a b,_) | a < 0 || b >= rows m = extractError m e -m ?? e@(_,Range a b) | a < 0 || b >= cols m = extractError m e +m ?? (Range a s b,e) | s /= 1 = m ?? (Pos (idxs [a,a+s .. b]), e) +m ?? (e,Range a s b) | s /= 1 = m ?? (e, Pos (idxs [a,a+s .. b])) + +m ?? e@(Range a _ b,_) | a < 0 || b >= rows m = extractError m e +m ?? e@(_,Range a _ b) | a < 0 || b >= cols m = extractError m e m ?? e@(Pos vs,_) | minElement vs < 0 || maxElement vs >= fromIntegral (rows m) = extractError m e m ?? e@(_,Pos vs) | minElement vs < 0 || maxElement vs >= fromIntegral (cols m) = extractError m e m ?? (All,All) = m -m ?? (Range a b,e) | a > b = m ?? (Take 0,e) -m ?? (e,Range a b) | a > b = m ?? (e,Take 0) +m ?? (Range a _ b,e) | a > b = m ?? (Take 0,e) +m ?? (e,Range a _ b) | a > b = m ?? (e,Take 0) m ?? (Take n,e) | n <= 0 = (0>>> vector [1..10] ! 3 4.0 +On a matrix it gets the k-th row as a vector: + >>> matrix 5 [1..15] ! 1 fromList [6.0,7.0,8.0,9.0,10.0] @@ -479,12 +481,18 @@ instance Testable (Matrix I) where checkT _ = test test :: (Bool, IO()) -test = (and ok, print ok) +test = (and ok, return ()) where m = (3><4) [1..12] :: Matrix I + r = (2><3) [1,2,3,4,3,2] + c = (3><2) [0,4,4,1,2,3] + p = (9><10) [0..89] :: Matrix I + ep = (2><3) [10,24,32,44,31,23] md = fromInt m :: Matrix Double ok = [ tr m <> m == toInt (tr md <> md) , m <> tr m == toInt (md <> tr md) , m ?? (Take 2, Take 3) == remap (asColumn (range 2)) (asRow (range 3)) m + , remap r (tr c) p == ep + , tr p ?? (PosCyc (idxs[-5,13]), Pos (idxs[3,7,1])) == (2><3) [35,75,15,33,73,13] ] -- cgit v1.2.3