changeset 4631:d35d316049e8

A little optimization and handle the case that there are duplicates in the values.
author Sascha L. Teichmann <teichmann@intevation.de>
date Mon, 03 Dec 2012 21:16:15 +0100
parents 63368dcc3f94
children 02cf2b1dff84
files flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java
diffstat 1 files changed, 19 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java	Mon Dec 03 18:44:48 2012 +0100
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java	Mon Dec 03 21:16:15 2012 +0100
@@ -10,49 +10,56 @@
 
     public static double[][] simple(double[][] values, double radius) {
         TreeMap<Double, Double> map = toMap(values);
-        double[][] result = new double[values.length][values[0].length];
+        int N = map.size();
+        double [] xs = new double[N];
+        double [] ys = new double[N];
         int ndx = 0;
         for (double x: map.keySet()) {
             SortedMap<Double, Double> range =
                 map.subMap(x-radius, true, x+radius, true);
             double avg = 0d;
-            for (Double v: range.values()) {
+            for (double v: range.values()) {
                 avg += v;
             }
             avg /= range.size();
-            result[0][ndx] = x;
-            result[1][ndx] = avg;
+            xs[ndx] = x;
+            ys[ndx] = avg;
             ndx++;
         }
-        return result;
+        return new double [][] { xs, ys };
     }
 
     public static double[][] weighted(double[][] values, double radius) {
         TreeMap<Double, Double> map = toMap(values);
-        double[][] result = new double[values.length][values[0].length];
+        int N = map.size();
+        double [] xs = new double[N];
+        double [] ys = new double[N];
         int ndx = 0;
+        double _1radius = 1d/radius;
         for (double x: map.keySet()) {
             double avg = 0d;
             double weights = 0d;
             for (Map.Entry<Double, Double> e:
                 map.subMap(x-radius, false, x+radius, false).entrySet()
             ) {
-                double weight = 1d - Math.abs(x - e.getKey())/radius;
+                double weight = 1d - Math.abs(x - e.getKey())*_1radius;
                 avg += weight*e.getValue();
                 weights += weight;
             }
             avg /= weights;
-            result[0][ndx] = x;
-            result[1][ndx] = avg;
+            xs[ndx] = x;
+            ys[ndx] = avg;
             ndx++;
         }
-        return result;
+        return new double [][] { xs, ys };
     }
 
     private static TreeMap<Double, Double> toMap(double[][] values) {
         TreeMap<Double, Double> map = new TreeMap<Double, Double>();
-        for(int i = 0; i < values[0].length; i++) {
-            map.put(values[0][i], values[1][i]);
+        double [] xs = values[0];
+        double [] ys = values[1];
+        for (int i = 0; i < xs.length; i++) {
+            map.put(xs[i], ys[i]);
         }
         return map;
     }

http://dive4elements.wald.intevation.org