反转映射函数关系(c ++)

时间:2011-06-15 17:53:32

标签: c++ function mapping

我正在使用一个简单的函数(y(x)),我想从某个y值生成一个x值。虽然通常反向映射不会给出单个x值,但我使用的是y值中的最大值。这意味着输入的y值(最大值)将有一个唯一的x值。我不明白如何在c ++中编写代码

2 个答案:

答案 0 :(得分:0)

如果你不需要插值,只需要精确的反向查找,那么它相对简单:

std::map<YType, XType> lookup;
// (code to read the file goes here)
// for each x {
    YType y = f(x);
    if ((lookup.count(y) == 0) || (lookup[y] < x)) {
        lookup[y] = x;
    }
// }

然后你的反向查询只是lookup[y],如果数据中实际上缺少y,它将返回0(或适用的默认构造值)。

请注意我的代码效率有点低,它在地图中多次查找y,最多3次。您可以使用迭代器进行优化,但是我担心如果你这样做会模糊正在发生的事情我们还不熟悉它们:

typedef std::map<YType, XType> maptype;
typedef std::pair<maptype::iterator, bool> resulttype;

resulttype result = lookup.insert(std::make_pair(y, x));
if (!result.second) {
    // key already existed, so value was not inserted. Check for max.
    maptype::iterator pos = result.first;
    if ((*pos).second < x) {
        (*pos).second = x;
    }
}

答案 1 :(得分:0)

如果我理解正确,您将获得有限范围的值 x ,例如x[0]x[1],...,x[N]和函数f,并且您希望找到k最大可能的索引f(x[k])。在这种情况下,只需进行简单的搜索:

size_t k = 0;
T m = f(x[k]);
T tmp;

for (size_t i = 1; i <= N; ++i)
{
  if ((tmp = f(x[i])) > m)
  {
    k = i;
    m = tmp;
  }
}

// Maximum is (x[k], m)

此处TfT f(T);

的类型