2

私は最近傍探索プロジェクトに取り組んでおり、ユークリッド、マンハッタンなどの距離メトリックが必要です。それらを自分で実装するか、使用できる標準の Java コードがあるかどうか疑問に思っていましたか?

ありがとう

4

3 に答える 3

3

マンハッタン距離は、 で簡単に実装できMath.abs(x1-x2)+Math.abs(y1-y2)ます。

ユークリッド距離のメソッドを使用できますがPoint2D.distance(x1,y1,x2,y2)、計算はまったく難しくありません。

double dx = x1-x2, dy = y1-y2;
Math.sqrt(dx*dx+dy*dy);

これをより高い次元に拡張する必要がある場合は、座標を配列として渡し、ループを使用して平方和を計算します。

于 2012-11-14T21:30:05.917 に答える
2

RealVector-Interfaces を実装する Apaches ArrayRealVector を見てください。

そこには、n 次元ベクトルの L-1、L-inf、およびユークリッド ノルムとメトリックの実装があります。

https://code.google.com/p/symja/source/browse/trunk/commons-math/src/main/java/org/apache/commons/math3/linear/ArrayRealVector.java?r=883

于 2012-11-14T21:40:07.513 に答える
2

いくつかの車輪は小さすぎて、再発明しないようにしようとはしません。

public class Distances
{
    private Distances() {}

    public static euclidean(double a, double b)
    {
        return Math.sqrt(a * a + b * b);
    }

    public static manhatten(double a, double b)
    {
        return Math.abs(a) + Math.abs(b);
    }
}

使用法:

double x1 = 15.0, y1 = 15.0;
double x2 = 25.5, y2 = 37.25;

Distances.euclidean(x1 - x2, y1 - y2); // order does not matter
Distances.euclidean(y2 - y1, x1 - x2); // distance is the same regardless

Distances.manhatten(x1 - x2, y1 - y2);
于 2012-11-14T21:31:08.127 に答える