2013-03-11 3 views
7

ich den folgenden Code zu lesen (aus here)Linear Interpolation Code auf wikipedia - Ich verstehe nicht, es

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

aber ich verstehe es nicht.

Warum ist nicht das Ergebnis [y] berechnet, indem die

enter image description here

Formel?

+5

Für jeden, der den Code auf dieser Seite nicht finden kann, hat jemand ihn kurz nachdem er gepostet wurde, für Verwirrung gesorgt. – ughoavgfhw

+2

Programmierung ist nicht für irgendjemanden, manche Leute können es einfach nicht machen: (( – Vlad

Antwort

11

Es ist so berechnet.

Blick auf den ersten zwei Zeilen:

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

Die erste Zeile definiert x0 die Bodenfunktion. Dies liegt daran, der Gegenstand einen Gitterabstand von einem für die Probenpunkte annimmt, gemäß der Linie:

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

Jetzt konnten wir die zweite Zeile für Klarheit umschreiben als:

a = x_out[j] - k; 

Die zweite Zeile ist daher x-x0. Jetzt

, lassen Sie uns die Gleichung untersuchen:

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

Umschreiben dies im Hinblick auf y, x und x0 gibt:

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

der data[k+1].y als y1 und data[k].y als y0 umbenennen lassen:

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

Lassen Sie sich diese neu anordnen, indem x-x0 Herausziehen:

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

und neu anordnen wieder:

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

Auch hier ist der Gitterabstand wichtig:

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

So x1-x0 ist immer 1. Wenn wir es wieder einsetzen, erhalten wir

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

Welches ist genau die Gleichung, die Sie gesucht haben.

Zugegeben, es ist lächerlich, dass der Code nicht geschrieben ist, um das zu verdeutlichen.

+1

) Danke Richard, wikipedia soll die Dinge klar erklären, ich stimme deiner letzten Aussage zu. –