gpt4 book ai didi

c++ - 维基百科上的线性插值代码——我不明白

转载 作者:可可西里 更新时间:2023-11-01 18:25:41 24 4
gpt4 key购买 nike

我正在阅读以下代码(取自 here )

void linear_interpolation_CPU(float2* result, float2* data, 
float* x_out, int M, int N) {
float a;
for(int j = 0; j < N; j++) {
int k = floorf(x_out[j]);
a = x_out[j] - floorf(x_out[j]);
result[j].x = a*data[k+1].x + (-data[k].x*a + data[k].x);
result[j].y = a*data[k+1].y + (-data[k].y*a + data[k].y);
}
}

但我不明白。

为什么result[y]不是用计算出来的

enter image description here

公式?

最佳答案

它是这样计算的。

看前两行:

int k = floorf(x_out[j]);
a = x_out[j] - floorf(x_out[j]);

第一行使用 floor 函数定义了 x0。这是因为文章假设样本点的格间距为 1,按照以下行:

the samples are obtained on the 0,1,...,M lattice

现在我们可以将第二行重写为:

a = x_out[j] - k;

因此第二行是x-x0

现在,让我们检查一下等式:

result[j].y = a*data[k+1].y + (-data[k].y*a + data[k].y);

根据 yxx0 重写它得到:

y = (x-x0)*data[k+1].y + (-data[k].y*(x-x0) + data[k].y);

让我们将 data[k+1].y 重命名为 y1 并将 data[k].y 重命名为 y0:

y = (x-x0)*y1 + (-y0*(x-x0) + y0);

让我们通过拉出 x-x0 来重新排列:

y = (x-x0)*(y1-y0) + y0;

然后重新排列:

y = y0 + (y1-y0)*(x-x0);

同样,格子间距很重要:

the samples are obtained on the 0,1,...,M lattice

因此,x1-x0 始终为 1。如果我们把它放回去,我们会得到

y = y0 + (y1-y0)*(x-x0)/(x1-x0);

这正是您正在寻找的方程式。

诚然,没有编写代码以使其显而易见是荒谬的。

关于c++ - 维基百科上的线性插值代码——我不明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15345528/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com