4

如何在标准化之前对已标准化的向量进行非标准化以获得原始值?

例如:

vec = [-0.5, -1.0, 0.0]
vec_length = sqrt(vec.x^2 + vec.y^2 + vec.z^2)
vec_normalized = [vec.x/vec_length, vec.y/vec_length, vec.z/vec_length]

产量:

vec_length = 1.11803
vec_normalized = [-0.447214,-0.894427,0]

如何从归一化向量 [-0.447214,-0.894427,0] 中获取原始向量 [-0.5, -1.0, 0.0]?

谢谢!

4

2 回答 2

7

你不能。
有无数个向量,其归一化形式为[-0.447214, -0.894427, 0]

如果你想要一个“更好”的形式,你可以尝试放大到任意数字,随机示例:

我想x成为-3

scale = -3 / vec_normalized.x;
vec2 = [vec_normalized.x * scale, vec_normalized.y * scale, vec_normalized.z * scale];

结果:

scale = 6.70819787
vec2 = [-3, -6, 0]

但要注意不要选择是的组件0,因为那样会屈服scale = infinity

于 2014-11-13T15:37:35.773 回答
3

恢复:除法的逆运算是乘法。因此:

vec = [vec_normalized.x*vec_length,
       vec_normalized.y*vec_length,
       vec_normalized.z*vec_length]

如果vec_length未知,则无法恢复原始向量。归一化可以看作是方向+幅度方向的有损压缩。有无数个向量映射到单个归一化向量。

在数学上,将多个不同输入值映射到单个输出值的函数是不可逆的。

关于归一化向量的一个很好的属性是,如果您想要一个具有该方向的特定幅度f,您可以将向量f相乘,并知道它的长度为f

精度: 但是,请注意,这不一定给你原始向量,而是在一般情况下,它的近似值。这是因为浮点数在内存中表示的精度有限。因此,计算中的归一化向量实际上可能不是数学上精确的归一化向量。

于 2014-11-13T15:34:04.080 回答