【问题标题】:Nearest Neighbours using Quaternions使用四元数的最近邻
【发布时间】:2011-06-22 11:45:48
【问题描述】:

给定一个四元数,我想在一组四元数中找到它最近的邻居。为此,我显然需要一种方法来比较两个四元数之间的“距离”。这种比较需要什么样的距离表示,它是如何计算的?

谢谢,

乔什

【问题讨论】:

    标签: distance quaternions nearest-neighbor


    【解决方案1】:

    你的四元数只是 3D 空间中的一个点吗?

    那么两个四元数x1,y1,z1,w1x2,y2,x2,w2之间的距离由下式给出:

    distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2),假设w 组件用于定向。 IE。这与两个 3D 点之间的距离相同。

    你的四元数是 4D 空间中的一个点吗?

    那么它们之间的距离由下式给出:

    distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 + (w1-w2)^2).

    这只是 4D 空间的扩展。这个euclidean distance 公式适用于任意数量的维度。

    【讨论】:

    • 感谢您的回答。四元数表示为 4D 空间中的一个点。我按照建议使用了欧几里得距离,它提供了合理的结果。
    • 在那里的第二个公式中发现了一个额外的括号,但由于它少于 6 个字符,因此无法进行编辑。应该是distance = sqrt((x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2 + (w1-w2)^2)。感谢您的回答!
    【解决方案2】:

    如果“距离”是指两个方向之间的最短圆弧旋转,那么简单的欧几里得距离是可以的(L2 或 norm2)。

    因为方向之间的角度可以写成

    theta = acos(q1.w*q2.w + q1.x*q2.x + q1.y*q2.y + q1.z*q2.z);
    

    然后,L2 越大,距离越大。

    注意:如果提供负点积,则查询前的所有四元数都应取反。您可以使用通常的 KNN 匹配来加快查询速度。

    【讨论】:

      【解决方案3】:

      这是一个老问题,但似乎需要更多答案。如果四元数是用于表示旋转的单位长度的四元数,那么欧几里德距离会给出一些有趣的结果,因为四元数提供了旋转空间的 2 倍冗余表示;即,四元数及其否定表示相同的方向。在这种情况下,正确的距离度量是四元数之间的角度,限制在[0,pi/2] 范围内:

      theta = acos(q1.w*q2.w + q1.x*q2.x + q1.y*q2.y + q1.z*q2.z);
      if (theta>pi/2) theta = pi - theta;
      

      【讨论】:

        【解决方案4】:

        这实际上取决于您使用四元数的目的。一个简单的距离度量就是它们的差值的绝对值。

        如果 x = a + b i + c j + d k y = e + f i + g j + h k

        比欧几里得距离

         |x-y| = sqrt( (a-e)² + (b-f)² + (c-g)² + (d-h)² )
        

        【讨论】:

          猜你喜欢
          • 2014-01-17
          • 1970-01-01
          • 1970-01-01
          • 2016-10-20
          • 2011-12-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-26
          相关资源
          最近更新 更多