Strecken eines Arrays

8

Ich habe einen Vektor von Samples, die eine Kurve bilden. Stellen wir uns vor, dass es 1000 Punkte gibt. Wenn ich es strecken möchte, um 1500 Punkte zu füllen, was ist der einfachste Algorithmus, der ordentliche Ergebnisse liefert? Ich suche nach etwas, das nur ein paar Zeilen C / C ++ ist.

Ich werde immer die Größe des Vektors erhöhen wollen, und der neue Vektor kann zwischen dem 1,1-fachen und dem 50-fachen der Größe des aktuellen Vektors liegen.

Danke!

    
twk 21.07.2010, 22:52
quelle

3 Antworten

6

Hier ist C ++ für lineare und quadratische Interpolation.
interp1( 5.3, a, n ) ist a [5] + .3 * (a [6] - a [5]), .3 des Weges von a [5] nach a [6];
interp1array( a, 1000, b, 1500 ) würde a auf b strecken.
interp2( 5.3, a, n ) zeichnet eine Parabel durch die 3 nächsten Punkte a [4] a [5] a [6]: glatter als interp1 aber immer noch schnell.
(Splines verwenden 4 nächste Punkte, noch glatter; wenn Sie Python lesen, siehe basic-spline-interpolation-in-ein-paar- Zeilen-von-Numpy .

%Vor%     
denis 23.07.2010, 13:44
quelle
2
  

Was ist der einfachste Algorithmus, der anständige Ergebnisse liefert?

Catmull-Rom-Splines. (wenn Sie eine glatte Kurve wollen)

Ссылка
Ссылка

Verwenden Sie für jedes neue Element die Bruchposition in einem alten Array und verwenden Sie den Bruchteil (f - floor (f)) als Interpolationsfaktor und den "Ganzzahl" (dh Floor (f)) -Teil, um die nächsten Elemente zu finden.

Dies setzt voraus, dass Sie mit Daten arbeiten, die mathematisch interpoliert werden können (Gleitkommazahlen). Wenn Daten nicht interpoliert werden können (Strings), ist die einzige Lösung, das nächste verfügbare Element des alten Arrays zu verwenden.

Sie müssen etwas optimieren, wenn die Punkte im Array nicht gleichmäßig verteilt sind.

    
SigTerm 21.07.2010 23:15
quelle
0

Die einfachste Option, die ich mir vorstellen kann, ist nur ein Fn, das das Array basierend auf Durchschnittswerten erweitert:

x, y, z

wird

x, avg (x, y), y, avg (y, z), z

Wenn Sie mehr Datenpunkte benötigen, führen Sie sie einfach mehrmals auf dem Vektor aus.

    
lyrisey 21.07.2010 23:16
quelle