diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java | 64 |
1 files changed, 34 insertions, 30 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java index bf621103..8fcf0c84 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/minkowski/SparseEuclideanDistanceFunction.java @@ -23,8 +23,6 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import java.util.BitSet; - import de.lmu.ifi.dbs.elki.data.SparseNumberVector; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; @@ -46,50 +44,56 @@ public class SparseEuclideanDistanceFunction extends SparseLPNormDistanceFunctio */ @Deprecated public SparseEuclideanDistanceFunction() { - super(2.0); + super(2.); } @Override public double doubleDistance(SparseNumberVector<?> v1, SparseNumberVector<?> v2) { // Get the bit masks - BitSet b1 = v1.getNotNullMask(); - BitSet b2 = v2.getNotNullMask(); - double accu = 0; - int i1 = b1.nextSetBit(0); - int i2 = b2.nextSetBit(0); - while (true) { - if (i1 == i2) { - if (i1 < 0) { - break; - } - // Both vectors have a value. - double val = v1.doubleValue(i1) - v2.doubleValue(i2); - accu += val * val; - i1 = b1.nextSetBit(i1 + 1); - i2 = b2.nextSetBit(i2 + 1); - } else if (i2 < 0 || (i1 < i2 && i1 >= 0)) { + double accu = 0.; + int i1 = v1.iter(), i2 = v2.iter(); + while(v1.iterValid(i1) && v2.iterValid(i2)) { + final int d1 = v1.iterDim(i1), d2 = v2.iterDim(i2); + if(d1 < d2) { // In first only - double val = v1.doubleValue(i1); + final double val = v1.iterDoubleValue(i1); accu += val * val; - i1 = b1.nextSetBit(i1 + 1); - } else { + i1 = v1.iterAdvance(i1); + } + else if(d2 < d1) { // In second only - double val = v2.doubleValue(i2); + final double val = v2.iterDoubleValue(i2); + accu += val * val; + i2 = v2.iterAdvance(i2); + } + else { + // Both vectors have a value. + final double val = v1.iterDoubleValue(i1) - v2.iterDoubleValue(i2); accu += val * val; - i2 = b2.nextSetBit(i2 + 1); + i1 = v1.iterAdvance(i1); + i2 = v2.iterAdvance(i2); } } + while(v1.iterValid(i1)) { + // In first only + final double val = v1.iterDoubleValue(i1); + accu += val * val; + i1 = v1.iterAdvance(i1); + } + while(v2.iterValid(i2)) { + // In second only + final double val = v2.iterDoubleValue(i2); + accu += val * val; + i2 = v2.iterAdvance(i2); + } return Math.sqrt(accu); } @Override public double doubleNorm(SparseNumberVector<?> v1) { - double accu = 0; - // Get the bit masks - BitSet b1 = v1.getNotNullMask(); - // Set in first only - for (int i = b1.nextSetBit(0); i >= 0; i = b1.nextSetBit(i + 1)) { - double val = v1.doubleValue(i); + double accu = 0.; + for(int it = v1.iter(); v1.iterValid(it); it = v1.iterAdvance(it)) { + final double val = v1.iterDoubleValue(it); accu += val * val; } return Math.sqrt(accu); |