Mercurial > hg > may
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": \(