我有一组3D矢量。如何验证这些矢量是否在同一平面
答案 0 :(得分:10)
首先,您应该选择N个点中的一个并从所有其他N-1点坐标中减去其坐标。因此,您获得了N-1个向量的集合。 N点是否在同一平面上的问题等同于知道N-1向量是否在穿过原点的平面中。
当且仅当三个矢量在同一平面中时,由三个矢量组成的任何矩阵3x3的行列式为零。您可以将两列设置为来自您的集合的两个固定的非共线矢量(这定义了包含原点的平面),然后通过将矩阵的第三列设置为其坐标来连续检查所有其他矢量,计算其行列式,并检查它是否为零精度。正如木片所指出的那样,计算具有良好精度的行列式并非完全无关紧要,因此最好使用经过良好测试的函数(就像矩阵包中的函数一样)。
另一种,计算速度更快,更精确的方法是采用两个向量,确保它们定义一个平面(即它们不是共线),然后计算它们的交叉乘积:这给出了一个法向量的向量平面。然后,您可以通过使用法线向量执行点积来确保每个其他向量位于同一平面中:仅当新向量与前两个向量位于同一平面时,此点积为零。
您可以通过计算其交叉积的范数来测试两个向量是否共线:如果范数不为零(达到给定的精度),则向量不是共线的。
答案 1 :(得分:3)
第三个奇异值应该与最大奇异值一样大10 ^ -15。如果不是这样,那么矢量并不都位于单个平面中。 (这假设你的工作是双精度的。同样,如果这个比例只有1e-13,我也不会抱怨。)
答案 2 :(得分:3)
不是三个观察的答案,第一个观察时间太长,无法作出评论。
观察#1:上述问题含糊不清。
为了说明这种模糊性,请考虑三个规范单位向量xhat,yhat和zhat。通过意义#1,这三个向量不是共面的。意思是#2,它们是。定义一个平面需要三个点,因此三个点不能是非共面的。另一个例子:
根据意义#1,这些向量不是共面的,而是它们的意思是#2。
如果第二个含义是正确的解释,那么按照迄今为止的解决方案中的描述进行减法是必不可少的。例如,考虑木片描述的SVD / PCA解决方案。绕过步骤1,“减去所有向量的平均值”将导致SVD发现xhat是第一个主要成分。
如果第一个含义是正确的解释,那么做那些减法绝对是错误的。在这里,SVD应该找到xhat作为第一个主要组件,并且应该发现确实存在三个重要组件。
观察#2:关于SVD与迭代解决方案
假设您手头有5000个向量。如果5000个向量确实是共面的,则SVD方法将比迭代方法更快。另一方面,如果查看前五个向量足以回答“否”,那么查看剩余的4995向量就是愚蠢的。哪个更好的解决方案取决于对答案通常是“是,他们是共面的”还是“不,他们不是共面”的期望。
观察#3:检测时
在计算机上将浮点数比较为零通常是个坏主意。区分小而不小是好得多的。这里是SVD发光的地方:只看第三个主成分与第一个成分的比例。通过迭代解决方案,区分小型与非小型相比更为困难。
答案 3 :(得分:-1)
Wikipedia拥有您需要的所有答案。 如您所知,3点确定一架飞机。因此,如果您的集合中有0,1,2或3个不同的向量,它们肯定在同一个平面上。
按照上面的链接,您将找到一种方法,从您的集合的前三个(不同)向量中确定飞机。另一部分告诉您如何计算剩余点到该平面的距离。如果所有这些距离都为0,则它们位于同一平面内。
答案 4 :(得分:-1)
一个简单的算法:
详细说明:
v_a = v_1
v_b = v_2 - v_a (v_a dot v_2)
。v_b
与v_a
正交,{v_a,v_b}
形成了该平面的标准正交基础。v_i
,请计算v_i' = v_i - v_a (v_i dot v_a) - v_b (v_i dot v_b)
。v_i'
对于任何向量都不为零,则该向量与向量v_1
和v_2
不在同一平面中。此算法假设您对包含所有向量的原点和末尾的平面感兴趣。相反,如果您正在考虑一组点而不是一组向量,只需先从每个点中减去所有点的平均值。
这基本上是Gram-Schmidt process的变体,用于建立标准正交基础。