我在使用具有等距输入的直接查找表进行 2D 插值时缺乏性能而苦苦挣扎。
目标是在表 z(x,y) 中找到 4 个值 (z00,z01,z11,z10),对应于每个输入 x 和 y 的两个最接近的值,(x0 < x < x1) 和 ( y0 < y < y1)。
例如,以下查找:
x
是的 | 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];
然后将二维插值作为沿 y0 和 y1 的两个 x 插值和一个 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;
关于如何改进这一点的任何建议?