summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
index a31ed6e7..38302573 100644
--- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
+++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/WeightedLPNormDistanceFunction.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2011
+ Copyright (C) 2012
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -26,6 +26,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction;
import java.util.Arrays;
import de.lmu.ifi.dbs.elki.data.NumberVector;
+import de.lmu.ifi.dbs.elki.data.spatial.SpatialComparable;
/**
* Weighted version of the Euclidean distance function.
@@ -68,6 +69,41 @@ public class WeightedLPNormDistanceFunction extends LPNormDistanceFunction {
}
return Math.pow(sqrDist, 1.0 / p);
}
+
+ @Override
+ public double doubleMinDist(SpatialComparable mbr1, SpatialComparable mbr2) {
+ // Optimization for the simplest case
+ if(mbr1 instanceof NumberVector) {
+ if(mbr2 instanceof NumberVector) {
+ return doubleDistance((NumberVector<?, ?>) mbr1, (NumberVector<?, ?>) mbr2);
+ }
+ }
+ // TODO: optimize for more simpler cases: obj vs. rect?
+ final int dim1 = mbr1.getDimensionality();
+ if(dim1 != mbr2.getDimensionality()) {
+ throw new IllegalArgumentException("Different dimensionality of objects\n " + "first argument: " + mbr1.toString() + "\n " + "second argument: " + mbr2.toString());
+ }
+
+ final double p = getP();
+ double sumDist = 0;
+ for(int d = 1; d <= dim1; d++) {
+ final double m1, m2;
+ if(mbr1.getMax(d) < mbr2.getMin(d)) {
+ m1 = mbr2.getMin(d);
+ m2 = mbr1.getMax(d);
+ }
+ else if(mbr1.getMin(d) > mbr2.getMax(d)) {
+ m1 = mbr1.getMin(d);
+ m2 = mbr2.getMax(d);
+ }
+ else { // The mbrs intersect!
+ continue;
+ }
+ final double manhattanI = m1 - m2;
+ sumDist += Math.pow(manhattanI, p) * weights[d - 1];
+ }
+ return Math.pow(sumDist, 1.0 / p);
+ }
@Override
public boolean equals(Object obj) {