我正在尝试编写一些代码来规范化元素[x,y,z]
的向量,但是想知道是否有一种方法来规范化元素,以便每次元素的总和都会增加到1。
我确实遇到过一个公式:(伪代码)
normalized = vectorA/ magnitude(vectorA)
但是,如果vectorA = [1,4,5]
然后使用上面的公式将给出:
magnitude = sqrt(1^2 + 4^2 + 5^2)
magnitude = sqrt(42)
magnitude = 6.48
现在基于此,如果我将向量的每个元素除以6.48
,那么:
1/6.48 = 0.154
4/6.48 = 0.62
5/6.48 = 0.77
正如你所看到的,总和大于1,因此公式不是每次都有效,我想知道是否有人知道如何在任何时候将元素之和等于1。
任何帮助将不胜感激
答案 0 :(得分:6)
让我们从图表开始:
B-------C
/| /|
A-------* |
| *-----|-G
|/ |/
*-------*
让我们进一步说明AG
是你的向量。为简单起见,我们将声明A
是原点[0, 0, 0]
。
如果您的目的是简单地以线性方式缩放值(AB
,BC
和CG
的长度),使它们合计为1,则只需将每个值除以总和:
/ x y z \
| ----- , ----- , ----- |
\ x+y+z x+y+z x+y+z /
在x+y+z
为您提供10
的特定情况下,您最终得到:
[0.1, 0.4, 0.5]
总计为一个。
您找到的公式适用于您希望向量AG
的长度为一的三维向量。
由于矢量的长度为:
,因此您的数据(大致)正确 2 2 2
sqrt ( height + width + depth )
= sqrt (0.154 * 0.154 + 0.62 * 0.62 + 0.77 * 0.77)
= sqrt ( 0.023716 + 0.3844 + 0.5929 )
= sqrt ( 1.001016 )
= 1.000507871
将你的数字插入到那里会给你一些接近1.0005
的东西,这可以理解为原始数字的四舍五入。
所以,底线,如果你想要向量的长度是一个,只需使用你在问题中发布的公式。如果你想将矢量坐标 sum 设为1,只需根据三个坐标的总和进行缩放。