使用四元数的最近邻居

时间:2011-02-07 01:10:34

标签: distance quaternions nearest-neighbor

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

谢谢,

约什

4 个答案:

答案 0 :(得分:10)

这是一个老问题,但似乎需要更多答案。如果四元数是用于表示旋转的单位长度四元数,则欧几里德距离将给出一些有趣的结果,因为四元数提供旋转空间的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;

答案 1 :(得分:5)

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

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

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

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

然后它们之间的距离由下式给出:

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

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

答案 2 :(得分:1)

这实际上取决于你使用四元数的原因。一个简单的距离测量就是它们差异的绝对值。

如果          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)² )

答案 3 :(得分:0)

如果"距离"你的意思是两个方向之间最短的圆弧旋转,比简单的欧几里德距离都好(L2或norm2)。

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

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

比,更大的L2,更大的距离。

注意:如果提供负点积,则应否定查询前的所有四元数。比你可以使用通常的KNN匹配来加速你的查询。