gpt4 book ai didi

c++ - 如何有效地规范化 vector C++

转载 作者:行者123 更新时间:2023-11-30 04:44:57 26 4
gpt4 key购买 nike

我想知道如何在 C++ 中高效地规范化 vector 。到目前为止,这就是我所拥有的。有没有办法让它更有效率和/或一次性完成。

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;
}

最佳答案

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

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

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

关于c++ - 如何有效地规范化 vector C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469359/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com