【问题标题】:Euclidean Distance between 2 Vectors Implementation2个向量之间的欧几里得距离实现
【发布时间】:2016-04-09 21:56:24
【问题描述】:

我完成了一本学术编程书籍中的一些练习。任务是实现 2 个向量并计算它们之间的欧几里得距离。不,这不是家庭作业,而是自学。

我正在就我的远程实现的正确性寻求一些反馈。

public class EuclideanDist
{
    public static void main(String[] args)
    {   
        EuclideanDist euc = new EuclideanDist();
        Random rnd = new Random();        

        int N = Integer.parseInt(args[0]);

        double[] a = new double[N];
        double[] b = new double[N];
        double[] x = new double[N];

        euc.print(euc.init(a, rnd));        
        euc.print(euc.init(b, rnd));        
        print(euc.distance(a, b, x));
    }

    private double[] init(double[] src, Random rnd)
    {
        for(int i = 0; i < src.length; i++)
        {
            src[i] = rnd.nextDouble();
        }
        return src;
    }
    private double[] distance(double[] a, double[] b, double[] x)
    {
        double diff; 
        int N = a.length;

        for(int i = 0; i < N; i++)
        {
            diff = a[i] - b[i];
            x[i] = Math.sqrt(diff * diff);
        }
        return x;
    }
    private static void print(double[] x)
    {
        int N = x.length;
        for(int j = 0; j < N; j++)
            System.out.print(" " + x[j] + " ");
        System.out.println();
    }
}

【问题讨论】:

  • 你有什么问题?
  • 这是Java;你为什么把它标记为 C++?
  • 距离应该是一个标量,而不是一个向量;沿每个轴的距离平方和的平方根。 sqrt(diff * diff) 显然只是 diff
  • 我认为 OP 使用 sqrt(diff*diff) 而不是 abs 来确保 diff 是 +ve。不评论最优性或其他,但sqrt(diff*diff) 并不总是等于diff
  • OP - 我认为你有一个概念问题,而不是编程问题。尝试阅读 some resources 了解欧几里得距离的含义 - 您的实施和对答案的评论暗示您误解了。

标签: java arrays vector euclidean-distance


【解决方案1】:

根据@AlanStokes 的建议,以下代码似乎是一种解决方案(我已经测试过):

import java.util.Random;

public class EuclideanDist {
    public static void main(String[] args) {
        EuclideanDist euc = new EuclideanDist();
        Random rnd = new Random();

        int N = Integer.parseInt(args[0]);

        double[] a = new double[N];
        double[] b = new double[N];

        euc.print(euc.init(a, rnd));
        euc.print(euc.init(b, rnd));
        System.out.println(euc.distance(a, b));
    }

    private double[] init(double[] src, Random rnd) {
        for (int i = 0; i < src.length; i++) {
            src[i] = rnd.nextDouble();
        }
        return src;
    }

    private double distance(double[] a, double[] b) {
        double diff_square_sum = 0.0;
        for (int i = 0; i < a.length; i++) {
            diff_square_sum += (a[i] - b[i]) * (a[i] - b[i]);
        }
        return Math.sqrt(diff_square_sum);
    }

    private void print(double[] x) {
        for (int j = 0; j < x.length; j++) {
            System.out.print(" " + x[j] + " ");
        }
        System.out.println();
    }
}

【讨论】:

  • 您的解决方案似乎给出了总距离。在我想确定数组条目之间的距离的情况下,这个解决方案似乎不起作用。非常欢迎您的反馈..
  • 我的想法很接近@JRichardSnape;或者,您能否提供有关您要计算的距离的数学公式?
  • @d_blk 非常感谢!
猜你喜欢
  • 2014-05-31
  • 1970-01-01
  • 2014-11-12
  • 2010-12-15
  • 2018-11-13
  • 2011-01-29
  • 2014-06-14
  • 2014-03-27
  • 2021-02-11
相关资源
最近更新 更多