# HG changeset patch # User Chris Cannam # Date 1382512203 -3600 # Node ID f33f9dfb8422825feca91d0c80326aec525c8ebc # Parent 76d41e53fad2072bd73808dab09f4fa99953ce91 Some Java for vector bits diff -r 76d41e53fad2 -r f33f9dfb8422 build.xml --- a/build.xml Fri Oct 18 11:18:45 2013 +0100 +++ b/build.xml Wed Oct 23 08:10:03 2013 +0100 @@ -25,11 +25,22 @@ classpath="${basedir}/../yeti/yeti.jar:${extjars}" /> - + + + + + + + + + + + diff -r 76d41e53fad2 -r f33f9dfb8422 src/may/bits/VectorBits.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/may/bits/VectorBits.java Wed Oct 23 08:10:03 2013 +0100 @@ -0,0 +1,42 @@ + +package may.bits; + +public class VectorBits +{ + public static double sum(double[] v) { + double tot = 0.0; + int len = v.length; + for (int i = 0; i < len; ++i) { + tot += v[i]; + } + return tot; + } + + public static double[] multiply(double[] v1, double[] v2) { + int len = v1.length; + if (v2.length < len) { + len = v2.length; + } + double[] out = new double[len]; + for (int i = 0; i < len; ++i) { + out[i] = v1[i] * v2[i]; + } + return out; + } + + public static void addTo(double[] out, double[] in, int len) { + for (int i = 0; i < len; ++i) { + out[i] += in[i]; + } + } + + public static double[] scaled(double[] v, double factor) { + int len = v.length; + double[] out = new double[v.length]; + for (int i = 0; i < len; ++i) { + out[i] = v[i] * factor; + } + return out; + } +} + diff -r 76d41e53fad2 -r f33f9dfb8422 src/may/vector/blockfuncs.yeti --- a/src/may/vector/blockfuncs.yeti Fri Oct 18 11:18:45 2013 +0100 +++ b/src/may/vector/blockfuncs.yeti Wed Oct 23 08:10:03 2013 +0100 @@ -5,19 +5,15 @@ load may.vector.type; -//!!! "internal" vector function to retrieve data for read-only +import may.bits: VectorBits; + +// "internal" vector function to retrieve data for read-only // purposes without copying raw = (raw' v is ~double[] -> ~double[] = v; raw' as vector -> ~double[]); -sum' v = - (dat = raw v; - tot = new double[1]; - for [0..length dat - 1] do i: - tot[0] := tot[0] + dat[i] - done; - tot[0]); +sum' v = VectorBits#sum(raw v); max' v = (dat = raw v; @@ -73,10 +69,8 @@ (len = head (sort (map vec.length bb)); vv = map raw bb; out = new double[len]; - for [0..len-1] do i: - for vv do v: - out[i] := out[i] + v[i]; - done; + for vv do v: + VectorBits#addTo(out, v, len); done; vec.vector out); @@ -90,24 +84,16 @@ done; vec.vector out); -multiply 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 = VectorBits#multiply(raw b1, raw b2); scaled n v = if n == 1 then v - else vec.fromList (map (* n) (vec.list v)); + else VectorBits#scaled(raw v, n); fi; -divideBy n v = // Not just "scaled (1/n)" -- this way we get exact rationals +divideBy n v = if n == 1 then v - else vec.fromList (map (/ n) (vec.list v)); + else VectorBits#scaled(raw v, 1.0 / n); fi; sqr v =