2014-01-15 53 views
0

我正在研究一个C#项目来查找2点之间的欧几里得距离。euclidean距离C#

现在我有2这样的循环:

for (int i = 0; i < pregcount; i ++) 
     { 
      double dist_minima = double.MaxValue; 

      for (int j = 0; j < poiscount; j ++) 
      { 

       double distancia_cuadratica = Math.Pow(pois[j, 0] - preg[i, 0], 2) + Math.Pow(pois[j, 1] - preg[i, 1], 2) + Math.Pow(pois[j, 2] - preg[i, 2], 2); 

      } 
} 

reg和兴趣点是n个元素(预浸料为250元和兴趣点90万组的元素 有没有办法让这个更快的阵列矩阵?像在C#中的函数或库,将只计算距离更快?

我需要近2分钟就可以完成整个事情。第二循环中的计算是什么通吃的时间。

回答

1

对于starte rs,不要使用Math.Pow。

查找x = pois[j, 0] - preg[i, 0];

然后distancia_cuadratica = x * x + y * y + z * z;

你也不会似乎只找到两个点之间的距离 - 你似乎想从预浸您的POI值找到的最近点。它是否正确?它可能会影响我们向您推荐的总体算法。

除此之外,如果可以的话,尽量避免在紧密循环中声明变量。优选++jj++

您确实需要double的准确性吗?如果没有,您可以切换到float并节省一些速度。

.Net语言对于像这样的计算来说可能是不理想的。 C++可能是更好的选择。如果您使用C++,则可以使用矢量化内在函数来更快速地执行此类操作。我曾经使用过英特尔性能基元。现在,您可以使用CUDA等功能在GPU上执行这些计算。

如果你愿意,你可以尝试一些新的和实验性的,如CUDA Sharp