7

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

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);
    }   
}

但我不明白。

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

在此处输入图像描述

公式?

4

1 回答 1

12

是这样计算的。

看前两行:

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

第一行定义了x0使用 floor 函数。这是因为本文假设样本点的晶格间距为 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);

y用、x和重写它,x0给出:

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

让我们重命名为data[k+1].yy0 :y1data[k].y

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);

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

诚然,代码没有写得那么明显是荒谬的。

于 2013-03-11T18:24:41.363 回答