c++ - 三元 vector 的快速内积

标签 c++ c vector product

考虑两个 vector ,AB,大​​小为 n,7 <= n <= 23 . AB 都只包含-1、0 和1。

我需要一个计算AB 内积的快速算法。

到目前为止,我一直在考虑使用以下编码将符号和值存储在单独的 uint32_t 中:

  • 符号 0,值 0 → 0
  • 符号 0,值 1 → 1
  • 符号 1,值 1 → -1。

我想到的 C++ 实现如下所示:

struct ternary_vector {
    uint32_t sign, value;
};

int inner_product(const ternary_vector & a, const ternary_vector & b) {
    uint32_t psign = a.sign ^ b.sign;
    uint32_t pvalue = a.value & b.value;
    psign &= pvalue;
    pvalue ^= psign;
    return __builtin_popcount(pvalue) - __builtin_popcount(psign);
}

这工作得相当好,但我不确定是否可以做得更好。非常感谢对此事的任何评论。

最佳答案

我喜欢 2 uint32_t,但我认为您的实际计算有点浪费

只是一些小问题:

  • 我不确定引用(通过 const & 获取 ab)——这增加了一个级别与将它们放在堆栈上相比是间接的。当代码这么小(可能是几个时钟)时,这很重要。尝试按值传递,看看会得到什么

  • 不幸的是,
  • __builtin_popcount 可能效率很低。我自己用过,但发现即使是我写的一个非常基本的实现也比这快得多。但是 - 这取决于平台。

基本上,如果平台有硬件 popcount 实现,__builtin_popcount 会使用它。如果不是 - 它使用非常低效的替代品。

关于c++ - 三元 vector 的快速内积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19732598/

相关文章:

c++ - 无需信号量即可同步父级和子级

c++ - #include <winsqlite/winsqlite3.h> 在一个项目中工作,而不在另一个项目中工作

c++ - 到最近邻居的平均距离的近似值?

c - 尝试追踪 archLinux64 下的内存分配错误

c - 理解求和逻辑

java - 如何在 Java 中获取 vector <String> 数组作为返回值?

c++ - this_thread::sleep_for/SDL 渲染跳过指令

c++ - C++ 模板函数可以在返回参数上重载吗?

c++ - 为什么这个实现中的 push_back 保留 2 * capacity + 1 而不是 2 * capacity?

c++ - 如何修改 vector 成员的值?