changeset 556:6a5c20ceb949

Sorted, median, quantiles
author Chris Cannam
date Tue, 01 Apr 2014 10:35:45 +0100
parents 30799a778cac
children ab85dfc45e3f
files src/may/matrix.yeti src/may/matrix/complex.yeti src/may/vector.yeti src/may/vector/test/test_vector.yeti
diffstat 4 files changed, 64 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/src/may/matrix.yeti	Mon Mar 31 14:40:47 2014 +0100
+++ b/src/may/matrix.yeti	Tue Apr 01 10:35:45 2014 +0100
@@ -40,7 +40,7 @@
 
 module may.matrix;
 
-{ ceil } = load may.mathmisc;
+{ ceil, floor, random } = load may.mathmisc;
 
 vec = load may.vector;
 
@@ -364,7 +364,7 @@
     };
 
 constMatrix n = generate do row col: n done;
-randomMatrix = generate do row col: Math#random() done;
+randomMatrix = generate do row col: random () done;
 identityMatrix = constMatrix 1;
 
 transposed m =
@@ -992,7 +992,7 @@
                    done (vec.list row) |> strJoin "";
                done (asRows (columnSlice m c0 (c1 + 1))) |> strJoin "\n")
             ];
-        done [0..width m / chunk - 1] |> concat);
+        done [0..floor(width m / chunk)] |> concat);
 
 print' = println . format;
 eprint' = eprintln . format;
--- a/src/may/matrix/complex.yeti	Mon Mar 31 14:40:47 2014 +0100
+++ b/src/may/matrix/complex.yeti	Tue Apr 01 10:35:45 2014 +0100
@@ -5,6 +5,8 @@
 vec = load may.vector;
 cpx = load may.complex;
 
+{ floor } = load may.mathmisc;
+
 typedef opaque complexmatrix_t = {
     size is { rows is number, columns is number },
     real is Some mat.matrix_t | None (),
@@ -311,7 +313,7 @@
               (map do row: map cpx.format row |> strJoin "";
                done (asRows (columnSlice m c0 (c1 + 1))) |> strJoin "\n")
             ];
-        done [0..width m / chunk - 1] |> concat);
+        done [0..floor(width m / chunk)] |> concat);
 
 print' = println . format;
 eprint' = eprintln . format;
--- a/src/may/vector.yeti	Mon Mar 31 14:40:47 2014 +0100
+++ b/src/may/vector.yeti	Tue Apr 01 10:35:45 2014 +0100
@@ -18,7 +18,7 @@
 import java.util: Arrays;
 import may.bits: VectorBits;
 
-{ ceil } = load may.mathmisc;
+{ floor, ceil } = load may.mathmisc;
 
 /// Return a vector of n zeros.
 zeros n is number -> ~double[] =
@@ -208,6 +208,27 @@
         len: sum' v / len
     esac;
 
+sorted v is ~double[] -> ~double[] =
+   (v' = copyOf v;
+    Arrays#sort(v');
+    v');
+
+quantile q v is number -> ~double[] -> number =
+    if empty? v then 0
+    else
+        v = sorted v;
+        dist = q * (length v - 1);
+        low = floor dist;
+        high = ceil dist;
+        if low == high then v[low]
+        else
+            v[low] * (high - dist) + v[high] * (dist - low);
+        fi;
+    fi;
+
+median v is ~double[] -> number =
+    quantile 0.5 v;
+
 listOp f vv =
     case vv of
     [v]: v;
@@ -322,10 +343,13 @@
     slice,
     resizedTo,
     reverse,
+    sorted,
     repeated,
     concat = concat',
     sum = sum',
     mean,
+    median,
+    quantile,
     add,
     subtract,
     multiply,
@@ -364,10 +388,13 @@
     slice is vector_t -> number -> number -> vector_t,
     resizedTo is number -> vector_t -> vector_t,
     reverse is vector_t -> vector_t,
+    sorted is vector_t -> vector_t,
     repeated is vector_t -> number -> vector_t,
     concat is list?<vector_t> -> vector_t,
     sum is vector_t -> number,
     mean is vector_t -> number,
+    median is vector_t -> number,
+    quantile is number -> vector_t -> number,
     add is list?<vector_t> -> vector_t,
     subtract is vector_t -> vector_t -> vector_t,
     multiply is list?<vector_t> -> vector_t, 
--- a/src/may/vector/test/test_vector.yeti	Mon Mar 31 14:40:47 2014 +0100
+++ b/src/may/vector/test/test_vector.yeti	Tue Apr 01 10:35:45 2014 +0100
@@ -163,7 +163,36 @@
     compare ((vec.mean . vec.zeros) 0) 0 and
         compare ((vec.mean . vec.zeros) 5) 0 and
         compare ((vec.mean . vec.ones) 5) 1 and
-        compare ((vec.mean . vec.fromList) [1,-2,3,0]) 0.5
+        compare ((vec.mean . vec.fromList) [1,-2,3,0]) 0.5 and
+        compare ((vec.mean . vec.fromList) [1,-2,3,2]) 1
+),
+
+"median": \(
+    compare ((vec.median . vec.zeros) 0) 0 and
+        compare ((vec.median . vec.zeros) 5) 0 and
+        compare ((vec.median . vec.ones) 5) 1 and
+        compare ((vec.median . vec.fromList) [-2,1,2,3]) 1.5 and
+        compare ((vec.median . vec.fromList) [1,-2,3,2]) 1.5 and
+        compare ((vec.median . vec.fromList) [1,-2,3,0]) 0.5 and
+        compare ((vec.median . vec.fromList) [1,-2,3,0,6]) 1
+),
+
+"upperQuartile": \(
+    compare ((vec.quantile 0.75 . vec.zeros) 0) 0 and
+        compare ((vec.quantile 0.75 . vec.zeros) 5) 0 and
+        compare ((vec.quantile 0.75 . vec.ones) 5) 1 and
+        compare ((vec.quantile 0.75 . vec.fromList) [0,1,2]) 1.5 and
+        compare ((vec.quantile 0.75 . vec.fromList) [0,1,2,3]) 2.25 and
+        compare ((vec.quantile 0.75 . vec.fromList) [1,-2,3,2]) 2.25
+),
+
+"sorted": \(
+    compare ((vec.list . vec.sorted . vec.zeros) 0) [] and
+        compare ((vec.list . vec.sorted . vec.zeros) 5) [0,0,0,0,0] and
+        compare ((vec.list . vec.sorted . vec.ones) 5) [1,1,1,1,1] and
+        compare ((vec.list . vec.sorted . vec.fromList) [-2,1,2,3]) [-2,1,2,3] and
+        compare ((vec.list . vec.sorted . vec.fromList) [1,-2,3,2]) [-2,1,2,3] and
+        compare ((vec.list . vec.sorted . vec.fromList) [1,-2,-2.1,3,0.5,1]) [-2.1,-2,0.5,1,1,3]
 ),
 
 "add": \(