3

我在 Java 中使用 Apache Commons RealVector 和 ArrayRealVector 类。我可以计算两个向量 v1 和 v2 之间的欧式距离为

double dist = v1.getDistance(v2);

但是,我正在寻找平方欧几里得距离。我知道有一种方法可以使用 Apache Commons Vector3D 来做到这一点 - 只需使用 distanceSq 函数。我正在使用高维向量进行最近邻搜索,因此没有必要取平方根——这对我的需求来说只是计算上的浪费。

我可以做

ArrayRealVector diff = v1.subtract(v2);
double dist = diff.dotProduct(diff);

当然,这涉及返回一个我想避免的中间 ArrayRealVector。我可以很容易地编写代码来获得平方欧几里得距离,但我想使用 Apache Commons 数学的解决方案。任何内置的解决方案都会很棒——即使是其他 Apache Math 类的解决方案也可能没问题。

4

2 回答 2

1

看到这个:

http://svn.apache.org/repos/asf/mahout/trunk/core/src/main/java/org/apache/mahout/common/distance/EuclideanDistanceMeasure.java

这导致我:

https://builds.apache.org/job/Mahout-Quality/javadoc/org/apache/mahout/common/distance/SquaredEuclideanDistanceMeasure.html

我怀疑您是否想引入 Mahout 进行如此简单的计算,但您可能只需复制他们正在使用的任何代码。

于 2012-07-16T18:49:03.270 回答
1

首先,我建议平方根和乘法的开销可能与许多其他事情相比相形见绌。以简单的名义,我会一直坚持下去,dist * dist直到你确定这是瓶颈。

getDistanceSquared()由于这个原因,几乎可以肯定没有;我会说这就是 API 想要你做的。

例如,分配另一个RealVector.

如果真的很重要,只需将代码复制到getDistance()并取出平方根!

于 2012-07-16T19:28:31.050 回答