如何有效地规范向量C ++

时间:2019-08-12 23:19:27

标签: c++ performance normalization

我想知道如何在C ++中有效地标准化向量。到目前为止,这就是我所拥有的。有没有一种方法可以使其更高效和/或一次通过。

getListFact

2 个答案:

答案 0 :(得分:1)

有很多方法可以优化此算法的实现,具体取决于问题的具体情况。

  1. 对于所有循环,可以使用SIMD向量化来提高吞吐量。
  2. 如果向量非常宽,则可以使用多个线程来计算幅度。每个人都将计算出一部分总和,然后一些串行代码将收集结果。
  3. 如果您的值在范围内,则可以完全以浮点数形式工作,而不是加倍。
  4. 您可以通过使用内在函数(例如x86上的RSQRTSS)或如果没有这样的内在函数使用Quake's method来计算幅度的平方根。然后,您将根据该值进行缩放。

此外,通过将操作与规范化融合,可以更快地获得快得多的代码。假设您要添加两个向量并将结果标准化。您可以一次计算它们的总和及其大小,然后在一秒钟内进行缩放。

答案 1 :(得分:0)

如何一次完成。很明显,您不需要使用所有项目来计算public Image image; public void WheelClicker() { image.gameObject.transform.DORotate(new Vector3(0, 0, image.gameObject.transform.rotation.z + 90), 1); } ,并且在更新项目之前必须已经计算了它?

由于除法可能要比乘法更多,因此可能的优化方法是添加:

mag

然后您可以将类似的项目相乘:

double mag_inv = 1.0 / mag;

如果向量已经被归一化的可能性相对较高,则可能要检查output[i] = arr[i] * mag_inv; 是否等于1.0。