2012-07-16 97 views
3

我在Java中使用Apache Commons RealVector和ArrayRealVector类。我可以计算出两个向量V1和V2之间的欧氏距离在Apache Commons中与RealVectors的平方欧氏距离数学公式

double dist = v1.getDistance(v2); 

不过,我希望得到的欧氏距离平方。我知道有一种方法可以用Apache Commons Vector3D来实现 - 只需使用distanceSq函数即可。我正在做高维向量的最近邻居搜索,所以没有必要去考虑平方根 - 这对我的需求来说只是计算上的浪费。

我能做

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

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

回答

1

首先,我建议一个平方根和乘法的开销可能被很多其他的东西所淹没。为了简单起见,我只想跟dist * dist一起去,直到你确定这是瓶颈。

没有getDistanceSquared(),几乎肯定是这个原因;我会说这就是API要你做的事情。

例如,分配另一个RealVector确实会比较慢。

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

1
+0

如果他已经在使用Commons Math,那么复制Commons Math正在做的事情会更加相关。 – 2012-07-16 19:29:23

+0

是的,同意 - 这就是为什么我怀疑他想要拉马赫特。如果他担心自己不会像其他人一样快速写出代码,那么只需编写代码或从Mahout复制代码即可。 – 2012-07-16 19:37:29

+0

p.s.在我做了搜索之后,我对Mahout感到好奇,最终购买了你的书。 :-) – 2012-07-16 19:39:10