问题描述
我在使用具有等距输入的直接查找表进行 2D 插值时缺乏性能。
目标是找到表 z(x,y) 中的 4 个值 (z00,z01,z11,z10) 分别对应输入 x 和 y 的两个最接近的值,(x0
例如以下查找:
x
y | 1 | 2 | 3 |
---|---|---|---|
4 | 20 | 23 | 29 |
6 | 35 | 37 | 43 |
8 | 47 | 50 | 55 |
由以下数组表示:
const f32 lookup {20,35,47,23,37,50,29,43,55}
此外,连同数组的定义,一个结构提供以下数据以允许更有效的查找:
lowest_x = 1;
lowest_y = 4;
step_x = 1;
step_y = 2;
length_x = 3;
length_y = 3;
该算法最耗时的部分是找到与输入 x 和 y 前后值的交集对应的索引。
我目前的方法是按如下方式计算它们:
鉴于 x0 和 y0 是指数的倍数:
index_x0 = u32 ((x-lowest_x)/step_x);
index_y0 = u32 ((y-lowest_y)/step_y);
那么 x0,x1,y0 和 y1 是:
x0 = lowest_x + index_x0 * step_x ;
x1 = x0 + step_x ;
y0 = lowest_y + index_y0 * step_y ;
y1 = y0 + step_y ;
查找 z(x,y) 的 4 个必要值是:
z00_index = index_x0*length_y0+index_y0;
z00= lookup[z00_index]
z01= lookup[z00_index+1]
z10= lookup[z00_index+length_y0];
z11= lookup[z00_index+length_y0+1];
然后将二维插值作为 x 沿 y0 和 y1 的两次插值和 y 的一次插值执行:
zxy0 = (x1-x)/(x1-x0)*z00 + (x-x0)/(x1-x0)*z10;
zxy1 = (x1-x)/(x1-x0)*z01 + (x-x0)/(x1-x0)*z11;
z = (y1-y)/(y1-y0)*zxy0 + (y-y0)/(y-y0)*zxy1;
关于如何改进这一点有什么建议吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)