diff options
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.java | 38 |
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) { |