【问题标题】:euclidean distance C#欧几里得距离 C#
【发布时间】:2014-02-04 16:57:19
【问题描述】:

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

现在我有 2 个这样的 for 循环:

 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);

           }
}

preg 和 pois 是 n 个元素的数组矩阵(preg 是 250 个元素,pois 是 900,000 个元素 有没有办法让它更快?像 C# 中的函数或可以更快地计算距离的库?

我花了将近 2 分钟来完成整个事情。第二个循环中的计算一直是耗时的。

【问题讨论】:

    标签: for-loop euclidean-distance


    【解决方案1】:

    对于初学者,不要使用 Math.Pow。

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

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

    您似乎也不只是在寻找两点之间的距离 - 您似乎想要找到从 preg 到您的 pois 值的最近点。它是否正确?它可能会对我们向您建议的整体算法产生影响。

    除此之外,尽量避免在紧密循环中声明变量,如果可以的话。更喜欢++j 而不是j++

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

    .Net 语言可能不适合这样的计算。 C++ 可能是更好的选择。例如,如果您使用 C++,则可以使用矢量化内在函数更快地执行此类操作。我曾经使用英特尔性能基元。现在您可以使用 CUDA 之类的东西在 GPU 上进行这些计算。

    如果您愿意,可以尝试一些新的和实验性的东西,例如 CUDA Sharp

    【讨论】:

      猜你喜欢
      • 2013-03-02
      • 2015-07-15
      • 1970-01-01
      • 2021-10-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多