我正在研究一个C#项目,找到2点之间的欧氏距离。
现在我有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);
}
}
preg和pois是n个元素的数组矩阵(preg是250个元素,pois是900,000个元素 有没有办法让这更快?像C#中的函数或只能更快地计算距离的库?
我花了差不多2分钟来完成整件事。第二个循环内的计算是一直需要的。
答案 0 :(得分:1)
对于初学者,请不要使用Math.Pow。
查找x = pois[j, 0] - preg[i, 0];
等。
然后distancia_cuadratica = x * x + y * y + z * z;
您似乎也没有找到两点之间的距离 - 您似乎想要找到从preg到pois值的CLOSEST点。它是否正确?它可能会对我们建议您的总算法产生影响。
除此之外,如果可以的话,尽量避免在紧密循环中声明变量。首选++j
至j++
。
您真的需要double
准确度吗?如果没有,您可以切换到float
并节省一些速度。
.Net语言可能不适合这样的计算。 C ++可能是更好的选择。例如,如果您使用C ++,则可以使用矢量化内在函数来更快地执行此类操作。我曾经使用过Intel Performance Primitives。现在你可以使用像CUDA这样的东西在GPU上进行这些计算。
如果您愿意,可以尝试新的和实验性的内容,例如CUDA Sharp。