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

そのように計算されます。

最初の 2 行を見てください。

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

1 行目はx0floor 関数の使用を定義しています。これは、次の行のように、記事がサンプル ポイントの格子間隔を 1 と想定しているためです。

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

ここで、わかりやすくするために 2 行目を次のように書き直すことができます。

a = x_out[j] - k;

したがって、2 行目は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);

名前をy0に変更data[k+1].yしましょう。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 に答える