【问题标题】:Reverse complex 2D lookup table反向复杂二维查找表
【发布时间】:2015-05-26 06:24:45
【问题描述】:

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

由于 的计算成本很高,我的想法是使用查找表方法。我可以生成一个维度为(正向查找表)的二维查找表,但我真正需要的是这个查找表的倒数——基于给定的 生成。

对于查找表的反转,我能想到的最简单的方法是将正向查找表的条目用作顶点,并在规则网格中在它们之间进行插值,从而产生反向查找表。如果反向查找表对于所需的精度来说太大了,我会生成粗略表并将这些值用作优化算法的起始值。我还缺少什么更简单的方法吗?

其中、 是常量,、 是。

【问题讨论】:

  • 恐怕最好的算法将取决于你的功能。你能提供你的功能吗?
  • 我已经添加了函数的定义。
  • 如果 $\theta_0$ 是常数,那么 $\cos\theta_0$ 也是。那么你不能从你的函数中消除 $2\sigma \over \cos\theta_0$ 吗?顺便说一句,你是如何在你的信息中加入方程式的?我的 LaTeX 没有被解析。
  • @Tolokoban 由于术语的分子不是恒定的,因此我无法消除该术语。我可以去掉一个积分,但不能同时去掉两个。方程嵌入为由 Google Charts API 生成的图像,如下所述:developers.google.com/chart/infographics/docs/formulas
  • 也不是 sigma,也不是 theta,取决于 z。所以你可以把它们放在各自的积分之外。

标签: algorithm math 2d interpolation lookup-tables


【解决方案1】:
  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. 然后重新开始,但不是全范围,而是围绕这一点

近似嵌套是这样完成的:

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) 上执行此操作,每个 e 计算有 100 点,这非常慢(大约 35 秒)

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

【讨论】:

  • 首先非常感谢您的回答!不幸的是 f(x,y) 不是单射函数,因此有 (x,y) 产生相同的 (a,b) 响应。但我会调查一下,如果f 的细分可能会有所帮助。但是,您在本地接近 f 响应与接近 (x,y) 的方法看起来很有趣。我是对的,您不是在计算实际的查找表,而是将其用作近似过程?
  • @Stefan 您通过近似计算 LUT 点一次,然后使用它...
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 2022-06-25
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 2021-08-06
  • 1970-01-01
相关资源
最近更新 更多