反向复杂的2D查找表

时间:2015-03-23 09:55:40

标签: algorithm math 2d interpolation lookup-tables

我有一些函数f(x,y)->(a,b),它将一些输入(x,y)映射到输出(a,b)。输出是一个复数。我真正感兴趣的是反函数g(a,b)->(x,y)。但由于这种反演不能以分析方式完成,我需要用数值近似来完成。

由于f(x,y)的计算成本很高,我的想法是使用查找表方法。我可以使用维度(x,y)生成一个2D查找表(正向查找表),但我实际需要的是此查找表的反转 - 根据给定的(x,y)产生(a,b)

对于查找表的反转,我能想到的最简单的方法是使用正向查找表的条目作为顶点,并在规则网格中插入它们,产生反向查找表。如果反向查找表对于所需的精度要大,我将生成粗表并使用这些值作为优化算法的起始值。有没有比我更容易的方法?

function definition

kztheta0为常量且hVsigma(x,y)

1 个答案:

答案 0 :(得分:2)

  1. f(x,y)您可以使用f(x,y)->(a,b) 2D LUT(查找表)

    但是存储的网格点必须选择得如此密集,以便每个网格矩形最多有一个凹凸,否则插值将无法正常工作。

    如果要使用线性插值,则局部最小值/最大值必须是LUT内的点,对于更高阶的多项式插值,并不总是需要。我会使用4 point cubic interpolation

  2. 如何计算g(a,b)->(x,y)

    • 首先是反向映射吗?
    • 那么有多少(x,y)个点返回相同的(a,b)=f(x,y)
    • 与问题相同:f是否起作用?

    如果f不起作用,那么你遇到了问题,你无法解决这个问题,除非以某种方式将范围细分为f功能的子范围,然后你必须选择合适的范围根据一些规则,取决于你想做什么。因此,假设f是函数

    那么如何计算(x,y)=g(a,b)

    f(x,y)=(a,b)
    1. 我会从结果的近似开始。因此,请在整个范围内尝试足够的(x,y)值,并将最近的点存储到所需的输出,以使|f(x,y)-(a,b)|最小化。

    2. 然后重新开始,但不是全范围,而是围绕这一点而不是

  3. 近似的嵌套如下所示:

    int n=5;  // recursions
    double e; // Error Of Solution Variable
    approx ax,ay;
    //            min    max   step   
    for (ax.init(-100.0,+100.0,10.0,n,&e);!ax.done;ax.step())
    for (ay.init(-100.0,+100.0,10.0,n,&e);!ay.done;ay.step())
        {
        e=|f(ax.a,ay.a)-(a,b)|;
        }
    // here (ax.a,ay.a) should hold your solution for input point `(a,b)`
    
    • 初始步骤应该尽可能小,以免没有错过
    • 如果您的g(a,b)形状太复杂,那么这可能无法正常工作

    从这里你可以计算逆LUT表......

    • 每次递归都会将步骤除以10,因此明智地选择n

    对于2D和奇点,这个表现并不差O((log(N))^2)。我在3D O((log(N))^3)上执行此操作,每100次计算e点,这很慢(大约35秒)

    • 其中N=(10^n)*(max-min)/stepn是递归次数
    • 准确度为step/(10^n)
    • 不要忘记将min,max更改为您使用的范围......