I have modified the "faster" function to use centroidLengthSquare. Any
reason this wasnt there before?


Robin

earlier

@Override
  public double distance(double centroidLengthSquare, Vector centroid,
Vector v) {
        return distance(centroid, v);
  }

now

@Override
  public double distance(double centroidLengthSquare, Vector centroid,
Vector v) {
    Iterator<Vector.Element> iter = v.iterateNonZero();
    double lengthSquaredv = 0.0;
    while (iter.hasNext()) {
      Vector.Element elt = iter.next();
      lengthSquaredv += elt.get() * elt.get();
    }

    double dotProduct = centroid.dot(v);
    double denominator = Math.sqrt(centroidLengthSquare) *
Math.sqrt(lengthSquaredv);

    // correct for floating-point rounding errors
    if (denominator < dotProduct) {
      denominator = dotProduct;
    }

    return 1.0 - dotProduct / denominator;
  }

Reply via email to