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

App*_*per 5 c++ performance normalization

我想知道如何在 C++ 中有效地标准化向量。到目前为止,这就是我所拥有的。有没有办法提高效率和/或一次性完成。

std::array<float, MyClass::FEATURE_LENGTH> MyClass::normalize(const std::array<float, FEATURE_LENGTH>& arr) {
    std::array<float, MyClass::FEATURE_LENGTH> output{};
    double mod = 0.0;

    for (size_t i = 0; i < arr.size(); ++i) {
        mod += arr[i] * arr[i];
    }

    double mag = std::sqrt(mod);

    if (mag == 0) {
        throw std::logic_error("The input vector is a zero vector");
    }

    for (size_t i = 0; i < arr.size(); ++i) {
        output[i] = arr[i] / mag;
    }

    return output;
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ing 5

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

  1. 对于所有循环,您可以使用 SIMD 矢量化来提高吞吐量。
  2. 如果您的向量非常,那么您可以使用多个线程来计算幅度。每个人都会计算部分和,然后一些串行代码会收集结果。
  3. 如果您的值在范围内,您可以完全使用浮点数,而不是双精度数。
  4. 您可以使用内在函数(例如x86 上的RSQRTSS )或使用Quake 的方法(如果此类内在函数不可用)来计算幅度的倒数平方根。然后您将按该值进行缩放。

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