Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查找2个阵列中2个点之间的最小距离_C#_Algorithm_Distance_Min_Points - Fatal编程技术网

C# 查找2个阵列中2个点之间的最小距离

C# 查找2个阵列中2个点之间的最小距离,c#,algorithm,distance,min,points,C#,Algorithm,Distance,Min,Points,我有两个包含点(x、y和z)的列表,希望找到最近的点 我想我需要这样做: for (int i = 0; i < myarray1.Count; i++) { for (int j = 0; j < myarray2.Count; j++) { // Calculate the quadratic distance between 2 points (point in index i and j) // Then store the minimum dista

我有两个包含点(x、y和z)的列表,希望找到最近的点

我想我需要这样做:

for (int i = 0; i < myarray1.Count; i++)
{
  for (int j = 0; j < myarray2.Count; j++)
  {
    // Calculate the quadratic distance between 2 points (point in index i and j)
    // Then store the minimum distance I guess?   
  }
}
for(int i=0;i
要计算距离:

double sqr(double x) {return x*x;}

double distance(MyPoint a, MyPoint b) {
  return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z);
}
var minimumDistance = distanceQuery.Min();
然后在第二个循环中存储到目前为止找到的最小距离:

double d = distance(myarray1[i],myarray2[j]);
if (d<min_d) min_d = d;
另一种选择是使用
使用将为您提供一个
O(logn)
复杂度,以找到距给定点集最近的点,并且您的代码将具有
O(logn)
,而不是
O(n^2)

有关如何使用它的实现和示例,请参见

首先,我将定义计算两点之间距离的函数,如Emanuelle Paolini的答案所示:

public double Distance(Point p1, Point p2)
{
   return Math.Sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p1.y) * (p1.y - p1.y) + (p1.z - p1.z) * (p1.z - p1.z));
}
然后我将查询两个列表,如下所示:

var distanceQuery = from p1 in myarray1
                    from p2 in myarray2
                    select Dist(p1, p2);
最后,我将检索最小距离:

double sqr(double x) {return x*x;}

double distance(MyPoint a, MyPoint b) {
  return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z);
}
var minimumDistance = distanceQuery.Min();
公式是

Math.sqrt(Math.pow(Math.abs(x1-x2),2)+Math.pow(Math.abs(y1-y2),2)+Math.pow(Math.abs(z1-z2),2))


你到底有什么问题?将高层想法转换为实际代码?您在使用任何特定部件时有问题吗?您是否有一些实际的代码不起作用,我们可以帮助您?如果您关心效率,kd树是您最好的选择。Linq比2 for循环快吗?实际上,根据我运行的一个快速测试,Linq在这里可能慢得多。如果
pow
的基数为负值,则您的方法不起作用,因此您应该说
pow(fabs(…),2)
Math.Pow(Math.Abs(…),2)
。更好的是,跳过
Pow
函数,将
x
平方化为
x*x
(此外,如果您只是比较距离以找到最短的距离,那么比较squarsm就足够了,这消除了
sqrt
,但无可否认,这是吹毛求疵。)@MOehm你确定当基数为负且指数为正整数时,
pow(a.x-b.x,2)
不起作用吗?@chux:我是肯定的,因为我有
pow(a,b)==exp(log(a)*b)
的概念,但结果我错了。我已经看了这个MSDN页面(),但错过了关于非整数指数的部分。我不使用C#并且有C的背景,但事实证明C的
pow
也可以处理整数指数的负基。尽管如此,我还是更喜欢平方的纯乘法,并且打赌它更快,如果只是稍微快一点的话。我发现Java的数学库没有一个sqr函数…怎么会是这样?最后一个函数的性能如何?以myarray2为900000个元素,myarray1 250为例?有没有更快的方法?
var minimumDistance = distanceQuery.Min();