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>;