考虑两个向量,A和B,大小为n, 7 <= n <= 23。A和B都仅由 -1、0 和 1 组成。
我需要一个快速算法来计算A和B的内积。
到目前为止,我已经考虑uint32_t
使用以下编码将符号和值存储在单独的 s 中:
- 符号 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);
}
这工作得相当好,但我不确定是否可以做得更好。对此事的任何评论都将受到高度赞赏。