使用mysql在3d中找到欧几里德距离的最有效方法是什么?

时间:2012-06-08 04:50:05

标签: php mysql algorithm math euclidean-distance

我有一个MySQL表,其中有数千个数据点存储在3列R,G,B中。如何使用欧几里德距离找到哪个数据点最接近给定点(a,b,c)?

我在表格中单独保存RGB颜色值,因此每列中的值限制为0-255。我要做的是通过找到欧氏距离最小的颜色找到最接近的颜色匹配。

我显然可以通过表格中的每个点来计算距离,但这不足以扩展。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

  1. 由于您正在寻找最小距离而不是精确距离,因此您可以跳过平方根。我认为Squared Euclidean Distance适用于此处。
  2. 您已经说过这些值的范围在0到255之间,因此您可以创建一个包含255个值的索引查找表。
  3. 这就是我在SQL方面的想法。 r0g0b0代表目标颜色。表Vector将保持上面提到的#2中的平方值。此解决方案将访问所有记录,但结果集可以通过排序并仅选择第一行来设置为1.

    select 
        c.r, c.g, c.b,
        mR.dist + mG.dist + mB.dist as squared_dist
    from 
        colors c,
        vector mR,
        vector mG,
        vector mB
    where
        c.r-r0 = mR.point and
        c.g-g0 = mG.point and
        c.b-b0 = mB.point
    group by
        c.r, c.g, c.b
    

答案 1 :(得分:2)

我认为上述评论都是正确的,但他们 - 在我的拙见中 - 没有回答原来的问题。 (如我错了请纠正我)。所以,让我在这里加上我的50美分:

你要求一个select语句,鉴于你的表被称为'colors',并且你的列被称为r,g和b,它们是整数范围0..255,你正在寻找值,在你的表中,最接近给定值,让我们说:rr,gg,bb,然后我敢于尝试以下内容:

select min(sqrt((rr-r)*(rr-r)+(gg-g)*(gg-g)+(bb-b)*(bb-b))) from colors;

现在,这个答案给出了很多警告,因为我不确定我的问题是否正确,所以请确认是否正确,或者纠正我以便我可以提供帮助。

答案 2 :(得分:1)

我看到你可以做的第一个优化级别是你想要限制查询的距离的平方,这样你就不需要为每一行执行平方根。 我鼓励的第二个优化级别是一些预处理,以减少每个查询的无关平方的需要(这可能会为RGB的大表创建一些额外的运行时间)。您必须进行一些基准测试才能看到,但是通过将值替换为a,b,c和d然后执行查询,您可以减轻MySQL的压力。

Latex

请注意,最后两行之间的性能差异可以忽略不计。您必须在系统上使用测试查询来确定哪个更快。

我只是重新阅读并注意到你是按距离订购的。在这种情况下,应该删除d应该移动到一侧。您仍然可以插入常量以防止在MySQL端进行额外处理。

答案 3 :(得分:0)

我相信有两种选择。

你必须如你所说的那样在整个集合中进行迭代并比较并检查最初设置的最大值,例如-1的不可思议的低数字。这是在线性时间内运行n次(因为你只是将1点与集合中的每个点进行比较,这会以线性方式进行缩放)。

我还在考虑另一种选择......就像在输入点上进行广度优先搜索一样,直到在搜索点的集合中找到一个点,但这需要更多的思考(我想3D空间必须非常大,因此平均来说效率更高。

答案 4 :(得分:0)

如果您遍历每个点并计算距离,请不要使用平方根函数,这是没有必要的。最小的平方和就足够了。

这是您要解决的problem。 (平面情况,选择按x,y或z轴排序的所有点。然后使用PHP处理它们)

MySQL也有一个Spatial Database可能会将此作为一个函数。我不是肯定的。