我正在使用一个简单的函数(y(x)),我想从某个y值生成一个x值。虽然通常反向映射不会给出单个x值,但我使用的是y值中的最大值。这意味着输入的y值(最大值)将有一个唯一的x值。我不明白如何在c ++中编写代码
答案 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)
此处T
是f
为T f(T);