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; }