teichmann@4630: package de.intevation.flys.artifacts.math; rrenkert@4625: rrenkert@4625: import java.util.Map; rrenkert@4625: import java.util.SortedMap; rrenkert@4625: import java.util.TreeMap; rrenkert@4625: rrenkert@4625: rrenkert@4625: public class MovingAverage rrenkert@4625: { rrenkert@4625: rrenkert@4625: public static double[][] simple(double[][] values, double radius) { rrenkert@4625: TreeMap map = toMap(values); rrenkert@4625: double[][] result = new double[values.length][values[0].length]; rrenkert@4625: int ndx = 0; rrenkert@4625: for (double x: map.keySet()) { rrenkert@4625: SortedMap range = rrenkert@4625: map.subMap(x-radius, true, x+radius, true); rrenkert@4625: double avg = 0d; rrenkert@4625: for (Double v: range.values()) { rrenkert@4625: avg += v; rrenkert@4625: } rrenkert@4625: avg /= range.size(); rrenkert@4625: result[0][ndx] = x; rrenkert@4625: result[1][ndx] = avg; rrenkert@4625: ndx++; rrenkert@4625: } rrenkert@4625: return result; rrenkert@4625: } rrenkert@4625: rrenkert@4625: public static double[][] weighted(double[][] values, double radius) { rrenkert@4625: TreeMap map = toMap(values); rrenkert@4625: double[][] result = new double[values.length][values[0].length]; rrenkert@4625: int ndx = 0; rrenkert@4625: for (double x: map.keySet()) { rrenkert@4625: double avg = 0d; rrenkert@4625: double weights = 0d; rrenkert@4625: for (Map.Entry e: rrenkert@4625: map.subMap(x-radius, false, x+radius, false).entrySet() rrenkert@4625: ) { rrenkert@4625: double weight = 1d - Math.abs(x - e.getKey())/radius; rrenkert@4625: avg += weight*e.getValue(); rrenkert@4625: weights += weight; rrenkert@4625: } rrenkert@4625: avg /= weights; rrenkert@4625: result[0][ndx] = x; rrenkert@4625: result[1][ndx] = avg; rrenkert@4625: ndx++; rrenkert@4625: } rrenkert@4625: return result; rrenkert@4625: } rrenkert@4625: rrenkert@4625: private static TreeMap toMap(double[][] values) { rrenkert@4625: TreeMap map = new TreeMap(); rrenkert@4625: for(int i = 0; i < values[0].length; i++) { rrenkert@4625: map.put(values[0][i], values[1][i]); rrenkert@4625: } rrenkert@4625: return map; rrenkert@4625: } rrenkert@4625: }