首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >比其他方法更好如果其他..。线性插值

比其他方法更好如果其他..。线性插值
EN

Stack Overflow用户
提问于 2012-07-09 14:16:11
回答 4查看 17K关注 0票数 14

问题很简单。让我们说你有功能

代码语言:javascript
运行
复制
double interpolate (double x);

你有一张桌子上面有x-> y的地图

例如

5. 15

7 18

10 22

注意:真正的表更大,这只是一个例子。

因此,对于8,您将返回18+((8-7)/(10-7))*(22-18)=19.3333333

我发现的一种很酷的方法是http://www.bnikolic.co.uk/blog/cpp-map-interp.html (长话短说,它使用std::map,key= x,value =y表示x->y数据对)。

如果有人问如果是什么,如果是其他方式的标题,它基本上是:

代码语言:javascript
运行
复制
if ((x>=5) && (x<=7))
{
//interpolate
}
else 
     if((x>=7) && x<=10)
     {
      //interpolate
     }

那么,是否有更聪明的方法来做这件事,或者地图方式是最先进的?)

顺便说一下,我更喜欢C++中的解决方案,但是很明显,任何有1:1映射到C++的语言解决方案都是不错的。

EN

回答 4

Stack Overflow用户

发布于 2012-07-26 17:57:20

嗯,我能想到的最简单的方法就是使用二进制搜索来找出你的观点所在。尽量避免地图,因为它们在实践中非常缓慢。

这是一个简单的方法:

代码语言:javascript
运行
复制
const double INF = 1.e100;
vector<pair<double, double> > table;
double interpolate(double x) {
    // Assumes that "table" is sorted by .first
    // Check if x is out of bound
    if (x > table.back().first) return INF;
    if (x < table[0].first) return -INF;
    vector<pair<double, double> >::iterator it, it2;
    // INFINITY is defined in math.h in the glibc implementation
    it = lower_bound(table.begin(), table.end(), make_pair(x, -INF));
    // Corner case
    if (it == table.begin()) return it->second;
    it2 = it;
    --it2;
    return it2->second + (it->second - it2->second)*(x - it2->first)/(it->first - it2->first);
}
int main() {
    table.push_back(make_pair(5., 15.));
    table.push_back(make_pair(7., 18.));
    table.push_back(make_pair(10., 22.));
    // If you are not sure if table is sorted:
    sort(table.begin(), table.end());
    printf("%f\n", interpolate(8.));
    printf("%f\n", interpolate(10.));
    printf("%f\n", interpolate(10.1));
}
票数 32
EN

Stack Overflow用户

发布于 2012-07-10 09:44:27

将你的观点按顺序存储:

代码语言:javascript
运行
复制
index X    Y
1     1 -> 3
2     3 -> 7
3     10-> 8

然后循环从最大到最小,一旦你得到低于一个数字,你就知道它是你想要的。

我们假设6是这样的:

代码语言:javascript
运行
复制
// pseudo
for i = 3 to 1
  if x[i] <= 6
    // you found your range!
    // interpolate between x[i] and x[i - 1]
    break; // Do not look any further
  end
end
票数 4
EN

Stack Overflow用户

发布于 2012-07-09 14:25:35

是的,我想你应该在这些间隔和自然数字之间画一张地图。我是说,给间隔贴上标签然后用开关:

代码语言:javascript
运行
复制
switch(I) {

    case Int1: //whatever
        break;

      ...

    default:

}

我不知道这是我想到的第一件事。

编辑开关比if -否则,如果您的数字在一个相对较小的间隔内(在进行映射时要考虑到这一点)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11396860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档