# HG changeset patch # User Chris Cannam # Date 1369172199 -3600 # Node ID 97e97a2e6a4e581d151f84cc02b286fb82383f4d # Parent 8043f7405eaec2d71b433b3dfb5e8577076df649 Implement add, subtract, scaled, abs diff -r 8043f7405eae -r 97e97a2e6a4e yetilab/vector/blockfuncs.yeti --- a/yetilab/vector/blockfuncs.yeti Tue May 21 21:58:34 2013 +0100 +++ b/yetilab/vector/blockfuncs.yeti Tue May 21 22:36:39 2013 +0100 @@ -45,6 +45,26 @@ len: sum' v / len esac; +add b1 b2 = + (v1 = raw b1; + v2 = raw b2; + len = if length v1 < length v2 then length v1 else length v2 fi; + out = new double[len]; + for [0..len-1] do i: + out[i] := v1[i] + v2[i] + done; + vec.vector out); + +subtract b1 b2 = + (v1 = raw b1; + v2 = raw b2; + len = if length v1 < length v2 then length v1 else length v2 fi; + out = new double[len]; + for [0..len-1] do i: + out[i] := v1[i] - v2[i] + done; + vec.vector out); + multiply b1 b2 = (v1 = raw b1; v2 = raw b2; @@ -58,12 +78,18 @@ divideBy n v = vec.fromList (map (/ n) (vec.list v)); +scaled n v = + vec.fromList (map (* n) (vec.list v)); + sqr v = multiply v v; rms = sqrt . mean . sqr; +abs' = + vec.fromList . (map abs) . vec.list; + sqrt' = vec.fromList . (map sqrt) . vec.list; @@ -80,8 +106,12 @@ { sum is vector -> number = sum', mean is vector -> number, +add is vector -> vector -> vector, +subtract is vector -> vector -> vector, multiply is vector -> vector -> vector, divideBy is number -> vector -> vector, +scaled is number -> vector -> vector, +abs is vector -> vector = abs', sqr is vector -> vector, sqrt is vector -> vector = sqrt', rms is vector -> number, diff -r 8043f7405eae -r 97e97a2e6a4e yetilab/vector/test/test_blockfuncs.yeti --- a/yetilab/vector/test/test_blockfuncs.yeti Tue May 21 21:58:34 2013 +0100 +++ b/yetilab/vector/test/test_blockfuncs.yeti Tue May 21 22:36:39 2013 +0100 @@ -4,7 +4,7 @@ stdSqrt = sqrt; { zeros, consts, ones, fromList, list } = load yetilab.vector.vector; -{ sum, max, min, mean, multiply, divideBy, sqr, sqrt, rms, fftshift, ifftshift } = load yetilab.vector.blockfuncs; +{ sum, max, min, mean, add, subtract, multiply, divideBy, scaled, abs, sqr, sqrt, rms, fftshift, ifftshift } = load yetilab.vector.blockfuncs; { compare } = load yetilab.test.test; [ @@ -37,6 +37,18 @@ compare ((mean . fromList) [1,-2,3,0]) 0.5 ), +"add": \( + compare (list (add (zeros 0) (ones 5))) [] and + compare (list (add (consts 3 4) (fromList [1,2,3]))) [4,5,6] and + compare (list (add (consts (-3) 4) (fromList [1,2,3]))) [-2,-1,0] +), + +"subtract": \( + compare (list (subtract (zeros 0) (ones 5))) [] and + compare (list (subtract (consts 3 4) (fromList [1,2,3]))) [2,1,0] and + compare (list (subtract (consts (-3) 4) (fromList [1,2,3]))) [-4,-5,-6] +), + "multiply": \( compare (list (multiply (zeros 0) (ones 5))) [] and compare (list (multiply (consts (-3) 4) (fromList [1,2,3]))) [-3,-6,-9] @@ -47,6 +59,16 @@ compare (list (divideBy 5 (fromList [1,2,-3]))) [0.2,0.4,-0.6] ), +"scaled": \( + compare (list (scaled 5 (ones 0))) [] and + compare (list (scaled 5 (fromList [1,2,-3]))) [5,10,-15] +), + +"abs": \( + compare (list (abs (ones 0))) [] and + compare (list (abs (fromList [1,2,-3]))) [1,2,3] +), + "sqr": \( compare ((list . sqr . zeros) 0) [] and compare ((list . sqr . ones) 5) [1,1,1,1,1] and