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

Joh*_*ing 7 c c++ interpolation

我正在阅读以下代码(摘自此处)

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);
    }   
}
Run Code Online (Sandbox Code Playgroud)

但我不懂.

为什么不使用结果[y]计算结果

在此输入图像描述

式?

Ric*_*ard 12

它是这样计算的.

看看前两行:

int k = floorf(x_out[j]);
a = x_out[j] - floorf(x_out[j]);
Run Code Online (Sandbox Code Playgroud)

第一行定义x0使用floor功能.这是因为该文章假定样本点的格子间距为1,如下所示:

the samples are obtained on the 0,1,...,M lattice
Run Code Online (Sandbox Code Playgroud)

现在我们可以重写第二行,以便明确:

a = x_out[j] - k;
Run Code Online (Sandbox Code Playgroud)

因此,第二行x-x0.

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

result[j].y = a*data[k+1].y + (-data[k].y*a + data[k].y);
Run Code Online (Sandbox Code Playgroud)

来讲,改写本y,xx0得到:

y = (x-x0)*data[k+1].y + (-data[k].y*(x-x0) + data[k].y);
Run Code Online (Sandbox Code Playgroud)

让我们重命名data[k+1].yy1data[k].yy0:

y = (x-x0)*y1 + (-y0*(x-x0) + y0);
Run Code Online (Sandbox Code Playgroud)

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

y = (x-x0)*(y1-y0) + y0;
Run Code Online (Sandbox Code Playgroud)

然后重新排列:

y = y0 + (y1-y0)*(x-x0);
Run Code Online (Sandbox Code Playgroud)

同样,晶格间距很重要:

the samples are obtained on the 0,1,...,M lattice
Run Code Online (Sandbox Code Playgroud)

因此,x1-x0总是1.如果我们把它放回去,我们得到

y = y0 + (y1-y0)*(x-x0)/(x1-x0);
Run Code Online (Sandbox Code Playgroud)

这就是你要找的方程式.

当然,编写代码以使其显而易见是荒谬的.