【问题标题】:Unique key from 5 integers for lookup-table查找表的 5 个整数的唯一键
【发布时间】:2015-02-19 21:09:04
【问题描述】:

我对图像数据使用 5 交叉中值滤波器的变体 在小型嵌入式系统上,即

    x
  x x x
    x

算法真的很简单,读取5个值,取最高的2个 并对它们进行一些计算并写回结果。

5个输入值都在0-20的范围内。计算出来的值也在0-20范围内!

我想知道是否可以使用查找表来加快速度 事情发生了,但我未能生成可以使用的密钥。

例如,考虑输入是否在 0-5 范围内, 生成唯一密钥的一种方法是获取二进制 表示并仅连接数字,即

101 101 101 101 101

key = x[0] | x[1] << 3 | x[2] << 6 | x[3] << 9 | x[4] << 12

但是 LUT 很大,大约有 23k 项。

由于[5,0,0,0,5][5,0,5,0,0] 相同,因此简化了 可能是使用 2 个 LUT,

LUT1 = [0, 1, 6, 31, 156, 781]

其中每个项目比 5 个项目的最大总和多 1 个 以前的元素

然后密钥可以计算为(使用python语法)

key = sum([LUT1[x[0]], LUT1[x[1]], LUT1[x[2]],
           LUT1[x[3]], LUT1[x[4]a]])

但同样,这种方法无法扩展到 0-20 的范围 每个元素。

使用中所述的排序网络 Fastest sort of fixed length 6 int array 不会提高性能;我只对2感兴趣 最高值。

那么,是否可以从五个正数中创建一个唯一键 可用作索引的 0-20 范围内的整数 LUT?

【问题讨论】:

  • 既然您只使用了两个最大值(而丢弃了其他三个),那么max2of5(...) 函数和 21*21=441 条目查找表的优化实现可能就足够了?
  • 你的意思是找到五个值中的最大值? [5,0,0,0,0] 和 [5,0,0,0,5] 都将最大值设为 5,但最终结果不同。计算部分并不复杂,但我试图摆脱“找到 2 个最高值”部分。还是它误解了你?
  • 也许我应该对函数更清楚一点 - 我的意思是一个函数,例如max2of5([5,0,0,0,0]) -&gt; [5,0]max2of5([5,0,0,0,5])-&gt; [5,5]。换句话说,它将返回两个最大的条目,而不仅仅是一个......
  • 啊,当然。我有一个相当好的。过滤器在高清分辨率视频上实时运行,所以我真的需要这个尽可能快,因此尝试转移到 LUT 解决方案,因为输入和输出定义得非常好。

标签: c data-structures lookup


【解决方案1】:

免责声明:这不是通用解决方案

我遇到了类似的问题,用这种方法解决了:

1) 在位掩码中为 5 个值中的每一个设置一个位(至少 21 位,因此需要 32 位变量)。

2) 如果该位已设置(=重复值),则将索引变量(初始化为 -1)设置为该值,如果它小于该值。

3) N知道解决方案“不通用”的部分,因为它的性能取决于非常快速的位扫描指令的可用性(例如 x86 有一个):找到最高的位设置。它的索引是该对的第一个值。

4) 如果它等于“重复值”变量,那么第二个值也是这个。

5) 否则,该对的第二个值是第二个最高位的索引。

6) 现在您有一对介于 0 和 20 之间的值,我认为 21x21 的查找表已经足够小了。

粗鲁的代码:

int dup = -1;
uint_32 m = 0;
uint_32 vm;
int i;

for (i = 0; i < 5; ++i) {
   vm = 1 << val[i];
   if ((m & vm) && (dup < val[i])) {
       dup = val[i];
   }
   else {
       m |= vm;
   }
}

// Now the part that needs a very fast "get higest bit" function

top[0] = get_higest_bit(m);
if (top[0] == dup) {
    top[1] = top[0];
}
else {
    m &= ~(1 << top[0]);
    top[1] = get_higest_bit(m);
}

编辑:此外,面向位的运算符(

【讨论】:

    猜你喜欢
    • 2021-10-10
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多