我在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类的解决方案也可能没问题。
答案 0 :(得分:1)
看到这个:
导致我:
我怀疑你是否想让Mahout进行如此简单的计算,但你可能只是复制他们正在使用的任何代码。
答案 1 :(得分:1)
首先,我建议平方根和乘法的开销可能会被很多其他东西相形见绌。以简单的名义,我只是选择dist * dist
,直到你确定这是瓶颈。
没有getDistanceSquared()
,几乎可以肯定是因为这个原因;我想说这就是API要你做的事情。
例如,分配另一个RealVector
确实会慢一些。
如果真的很重要,只需将代码复制到getDistance()
并取出平方根!