Mercurial > hg > may
changeset 459:2e87f815f5bc
Add zipped and unzipped
author | Chris Cannam |
---|---|
date | Fri, 25 Oct 2013 11:50:16 +0100 |
parents | a8078de88289 |
children | b3106795bbbf |
files | src/may/vector/blockfuncs.yeti src/may/vector/test/test_blockfuncs.yeti |
diffstat | 2 files changed, 47 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/may/vector/blockfuncs.yeti Thu Oct 24 18:53:27 2013 +0100 +++ b/src/may/vector/blockfuncs.yeti Fri Oct 25 11:50:16 2013 +0100 @@ -5,6 +5,8 @@ load may.vector.type; +{ ceil } = load may.mathmisc; + import may.bits: VectorBits; // "internal" vector function to retrieve data for read-only @@ -131,6 +133,35 @@ half = int(len/2); // round down for odd-length sequences vec.concat [vec.slice v half len, vec.slice v 0 half]); +zipped vv = + case vv of + [v]: v; + first::rest: + (len = vec.length first; + if len != min' (vec.fromList (map vec.length vv)) then + failWith "Vectors must all be of the same length"; + fi; + vec.fromList + (concat + (map do i: + map do v: + vec.at v i + done vv + done [0..len-1]))); + _: vec.zeros 0; + esac; + +unzipped n v = + if n == 1 then array [v] + else + len = vec.length v; + vv = array (map \(new double[ceil(len / n)]) [1..n]); + for [0..len-1] do x: + vv[x % n][int (x / n)] := vec.at v x; + done; + array (map vec.vector vv); + fi; + { sum is vector -> number = sum', mean is vector -> number, @@ -151,6 +182,8 @@ unityNormalised is vector -> vector, fftshift is vector -> vector, ifftshift is vector -> vector, +zipped is list?<vector> -> vector, +unzipped is number -> vector -> array<vector>, }
--- a/src/may/vector/test/test_blockfuncs.yeti Thu Oct 24 18:53:27 2013 +0100 +++ b/src/may/vector/test/test_blockfuncs.yeti Fri Oct 25 11:50:16 2013 +0100 @@ -4,7 +4,7 @@ stdSqrt = sqrt; { zeros, consts, ones, fromList, list } = load may.vector; -{ sum, max, min, maxindex, minindex, mean, add, subtract, multiply, divideBy, scaled, abs, negative, sqr, sqrt, rms, unityNormalised, fftshift, ifftshift } = load may.vector.blockfuncs; +{ sum, max, min, maxindex, minindex, mean, add, subtract, multiply, divideBy, scaled, abs, negative, sqr, sqrt, rms, unityNormalised, fftshift, ifftshift, zipped, unzipped } = load may.vector.blockfuncs; { compare } = load may.test.test; [ @@ -125,6 +125,19 @@ compare ((list . ifftshift . fromList) [4,5,1,2,3]) [1,2,3,4,5] ), +"zipped": \( + compare (list (zipped (map fromList []))) [] and + compare (list (zipped (map fromList [[],[]]))) [] and + compare (list (zipped (map fromList [[1,2]]))) [1,2] and + compare (list (zipped (map fromList [[1,2],[3,4],[5,6]]))) [1,3,5,2,4,6] +), + +"unzipped": \( + compare (map list (unzipped 1 (fromList []))) [[]] and + compare (map list (unzipped 1 (fromList [1,2,3]))) [[1,2,3]] and + compare (map list (unzipped 3 (fromList [1,3,5,2,4,6]))) [[1,2],[3,4],[5,6]] +), + ] is hash<string, () -> boolean>;