我正在尝试计算2d数组中2个值之间的欧式距离。我需要最大的存储空间,因此我有2个for循环遍历数组,并且我还有一个maxDistance变量来存储比较时的最大距离。
我的代码如下
//Returns the largest Euclidean distance between any two cities
within the cities array
public static double furthestDistance(int[][] x)
{
int power;
double sum = 0.0;
int distance = 0;
int maxDistance = 0;
for (int i = 0; i < x.length; i++)
{
for(int j = 0; j<x[0].length; j++)
{
sum = (x[i][j] - x[i][i+1]) + (x[i][j] - x[i][j+1]);
power = (int) Math.pow(sum, 2);
distance = (int)Math.sqrt(power);
if (distance > maxDistance)
{
maxDistance = distance;
}
}
}
return Math.sqrt(sum);
}
我遇到了问题,并收到一条错误消息,指出我的arrayIndex超出范围,但是我不确定遍历数组以找到2d数组中任何两个值之间的最大距离(大约10英寸)的最简单方法x,y坐标”
x是一个看起来像这样的城市
int[][] cities0 = {{22,-45},{-20,-43},{-45,29},{41,35},{21,4},
{23,-37},{16,-19},{-44,-10},{26,15},{6,-30},{2,35},{6,-19}};
我不确定我是否能够正确计算距离,甚至无法正确计算距离?
答案 0 :(得分:1)
欧几里德距离是
public static double calculateDistance(int[] array1, int[] array2)
{
double Sum = 0.0;
for(int i=0;i<array1.length;i++) {
Sum = Sum + Math.pow((array1[i]-array2[i]),2.0);
}
return Math.sqrt(Sum);
}
现在,问题是您有了一个点数组,每个点都由一个两个元素的数组表示。索引越界错误源于您拥有
sum = (x[i][j] - x[i][i+1]) + (x[i][j] - x[i][j+1]);
假设存在下一个i和下一个j,并且还假设x的第i个元素至少具有i + 2个元素,如果i> 0则会崩溃。使用我在回答开始时描述的方法,您的解决方案将如下所示:
double maxDistance = -1;
int firstPoint = -1;
int secondPoint = -1;
//notice that the limit is x.length - 1, because we will compare the penultimate
//item with the last
for (int i = 0; i < x.length - 1; i++) {
for (int j = i + 1; j < x.length; j ++) {
double d = calculateDistance(x[i], x[j]);
if (d > maxDistance) {
maxDistance = d;
firstPoint = i;
secondPoint = j;
}
}
}
答案 1 :(得分:0)
您的欧几里德距离计算在初始代码中是错误的。
此外,语句x[i][i+1]
也是有问题的,因为您将元组作为数据点,并且每个元组都位于不同的行中,这意味着
数组中的元素可以通过x[i][0]
或x[i][1]
访问,第二个括号中的任何大于1的值都将导致IndexOutOfBounds
错误。
修改代码的内部循环可以为您提供帮助:
for(int j = i + 1; j<x.length; j++)
{
sum = Math.pow((x[i][0] - x[j][0]), 2) + Math.pow((x[i][1] - x[j][1]), 2);
distance = Math.sqrt(sum);
System.out.println(distance);
if (distance > maxDistance)
{
maxDistance = distance;
}
}
因为我们有元组作为坐标,所以x[i][0] - x[j][0]
表示两点的x坐标之差,x[i][1] - x[j][1]
表示y坐标的差。使用该表示法,我们计算出欧几里得距离。剩下的就是您之前写的内容。另外,将变量更改为double
而不是int
可以更精确地计算!
注意:此示例是针对您在问题中提供的输入进行硬编码的,您可能需要对其进行修改才能与其他数组配合使用。