annotate flys-artifacts/src/main/java/de/intevation/flys/artifacts/math/MovingAverage.java @ 5584:d35a0bc153fa

Added missing validation check.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 05 Apr 2013 23:19:01 +0200
parents d35d316049e8
children fb9892036bd6
rev   line source
4630
63368dcc3f94 Moved MovingAverage into math package
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4625
diff changeset
1 package de.intevation.flys.artifacts.math;
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
2
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
3 import java.util.Map;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
4 import java.util.SortedMap;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
5 import java.util.TreeMap;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
6
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
7
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
8 public class MovingAverage
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
9 {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
10
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
11 public static double[][] simple(double[][] values, double radius) {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
12 TreeMap<Double, Double> map = toMap(values);
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
13 int N = map.size();
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
14 double [] xs = new double[N];
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
15 double [] ys = new double[N];
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
16 int ndx = 0;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
17 for (double x: map.keySet()) {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
18 SortedMap<Double, Double> range =
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
19 map.subMap(x-radius, true, x+radius, true);
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
20 double avg = 0d;
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
21 for (double v: range.values()) {
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
22 avg += v;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
23 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
24 avg /= range.size();
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
25 xs[ndx] = x;
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
26 ys[ndx] = avg;
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
27 ndx++;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
28 }
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
29 return new double [][] { xs, ys };
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
30 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
31
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
32 public static double[][] weighted(double[][] values, double radius) {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
33 TreeMap<Double, Double> map = toMap(values);
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
34 int N = map.size();
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
35 double [] xs = new double[N];
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
36 double [] ys = new double[N];
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
37 int ndx = 0;
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
38 double _1radius = 1d/radius;
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
39 for (double x: map.keySet()) {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
40 double avg = 0d;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
41 double weights = 0d;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
42 for (Map.Entry<Double, Double> e:
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
43 map.subMap(x-radius, false, x+radius, false).entrySet()
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
44 ) {
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
45 double weight = 1d - Math.abs(x - e.getKey())*_1radius;
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
46 avg += weight*e.getValue();
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
47 weights += weight;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
48 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
49 avg /= weights;
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
50 xs[ndx] = x;
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
51 ys[ndx] = avg;
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
52 ndx++;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
53 }
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
54 return new double [][] { xs, ys };
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
55 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
56
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
57 private static TreeMap<Double, Double> toMap(double[][] values) {
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
58 TreeMap<Double, Double> map = new TreeMap<Double, Double>();
4631
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
59 double [] xs = values[0];
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
60 double [] ys = values[1];
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
61 for (int i = 0; i < xs.length; i++) {
d35d316049e8 A little optimization and handle the case that there are duplicates in the values.
Sascha L. Teichmann <teichmann@intevation.de>
parents: 4630
diff changeset
62 map.put(xs[i], ys[i]);
4625
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
63 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
64 return map;
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
65 }
d6d16b5ab2f0 New class for average calculation implementing moving average algorithms.
Raimund Renkert <rrenkert@intevation.de>
parents:
diff changeset
66 }

http://dive4elements.wald.intevation.org