[英]Given 2 multidimensionals points in R^p, how to project N individuals on the line passing through those two points?
我在 R^p 中有 2 个点,我想在通过这两个点的线上投影 N 个个体。 确切地说,我想要由这条线创建的一维空间上每 N 个个体的坐标。
操作将在不同的点上重复多次,因此需要一种自动方法。 我想知道它是否存在一个包来找到这条线的方程。 该投影应该易于实施。
编辑(Vishwas 评论):
给定两个点Y1 =(1,4)Y2 =(5,6)做投影( https://en.wikipedia.org/wiki/Projection_(mathematics)的){X1,...,XN}中R2 到通过 y1 和 y2 的线上。
预期输出:原始空间中每个投影点 {x1,...,xN} 的坐标。
对于某些合适的 ti,点 xi 的投影是 zi = y1 + ti × (y2 - y1)。 剩下的差 xi - zi 与直线正交,所以点积 (xi - zi) • (y2 - y1) = 0。输入 zi 的定义,你会得到一个在 ti 中线性的方程。 您可以为 ti 求解,然后使用它来计算 zi。
如果你想对许多点进行这个操作,你可以想出一个预计算来表达整个操作,例如矩阵乘法。 由于您投影到会费的线不一定通过原点,因此您需要一个假设变换,它可以表示为作用于齐次坐标的 (p+1) × (p+1) 矩阵。
让我们将命名法切换为单字母符号。 让您的线由点 a 和 b 定义。 我们将点 x 投影到 z = a + t (b - a)。 所以你得到 0 = (x - a - t (b - a)) • (b - a) = (x - a) • (b - a) - t (b - a) • (b - a)可以求解 t = ((x - a) • (b - a)) / ((b - a) • (b - a))。
这是一些 Python 代码,您可以使用它们与您的实现进行比较:
def project(p, a, b, xs):
ab = [b[i] - a[i] for i in range(p)]
abab = sum(i*i for i in ab)
zs = []
for x in xs:
t = sum((x[i] - a[i])*ab[i] for i in range(p)) / abab
z = [a[i] + t*ab[i] for i in range(p)]
zs.append(z)
return zs
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.