规范化一个向量,使所有元素之和每次都加1

时间:2014-04-09 03:10:35

标签: java vector matrix normalization

我正在尝试编写一些代码来规范化元素[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。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:6)

让我们从图表开始:

  B-------C
 /|      /|
A-------* |
| *-----|-G
|/      |/
*-------*

让我们进一步说明AG是你的向量。为简单起见,我们将声明A是原点[0, 0, 0]

如果您的目的是简单地以线性方式缩放值(ABBCCG的长度),使它们合计为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,只需根据三个坐标的总和进行缩放。