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,x和x0得到:
y = (x-x0)*data[k+1].y + (-data[k].y*(x-x0) + data[k].y);
Run Code Online (Sandbox Code Playgroud)
让我们重命名data[k+1].y为y1和data[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)
这就是你要找的方程式.
当然,编写代码以使其显而易见是荒谬的.