Zahlenfolge kürzen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Zahlenfolge kürzen

    Moin
    Ich habe ein Problem und hoffe mir kann jemand einen Hinweis zur Lösung geben.
    Ich habe eine List(of Integer) die mir zu lang ist. Ich brauche nur eigentlich jede 90. Zahl für ein DrawCurve Chart (learn.microsoft.com/de-de/dotn…cs.drawcurve?view=net-8.0).
    Ich könnte mir jetzt zwar jede 90. Zahl schnappen, allerdings besteht die Gefahr, Spitzen im Chart dadurch zu ignorieren.

    Ich hoffe das ist verständlich genug erklärt.
    Danke schon mal. :thumbsup:
    In Arbeit...
    @vico255 Lege einen Spline durch die Punktwolke.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Habe es jetzt so gelöst.

    VB.NET-Quellcode

    1. ​Private Shared Function ReduceDataPointsByImportance(data As List(Of Tuple(Of DateTime, Decimal)), targetCount As Integer) As List(Of Tuple(Of DateTime, Decimal))
    2. ' Überprüfe, ob die Anzahl der Datenpunkte bereits kleiner oder gleich der Zielgröße ist
    3. If data.Count <= targetCount Then Return data
    4. ' Liste für die wichtigen Datenpunkte (beginnend mit dem ersten Punkt)
    5. Dim importantData As New List(Of Tuple(Of DateTime, Decimal)) From {data.First()}
    6. ' Finde die Maxima, Minima und Punkte mit signifikanten Veränderungen
    7. For i As Integer = 1 To data.Count - 2
    8. Dim prev = data(i - 1).Item2 ' Vorheriger Wert
    9. Dim curr = data(i).Item2 ' Aktueller Wert
    10. Dim nextVal = data(i + 1).Item2 ' Nächster Wert
    11. ' Identifiziere lokale Maxima, Minima oder signifikante Änderungen
    12. If (curr > prev AndAlso curr > nextVal) OrElse ' Lokales Maximum
    13. (curr < prev AndAlso curr < nextVal) OrElse ' Lokales Minimum
    14. (Math.Abs(curr - prev) > 0.05 * prev) Then ' Signifikante Änderung (hier 5%)
    15. importantData.Add(data(i))
    16. End If
    17. Next
    18. ' Füge den letzten Punkt hinzu
    19. importantData.Add(data.Last())
    20. ' Wenn die Anzahl wichtiger Datenpunkte immer noch größer als das Ziel ist, wende Uniform Sampling an
    21. If importantData.Count > targetCount Then
    22. ' Berechne die Schrittgröße für gleichmäßiges Sampling
    23. Dim stepSize As Double = importantData.Count / targetCount
    24. Dim reducedData As New List(Of Tuple(Of DateTime, Decimal))()
    25. ' Füge gleichmäßig verteilte Datenpunkte hinzu, basierend auf der Schrittgröße
    26. For i As Double = 0 To importantData.Count - 1 Step stepSize
    27. reducedData.Add(importantData(CInt(Math.Floor(i))))
    28. Next
    29. ' Gib die reduzierte Liste zurück
    30. Return reducedData
    31. End If
    32. ' Gib die wichtige Liste zurück (wichtigste Punkte behalten)
    33. Return importantData
    34. End Function


    Was diese Funktion macht:Wichtigkeit identifizieren:

    Sie überprüft jeden Datenpunkt, um festzustellen, ob er ein lokales Maximum, Minimum oder eine signifikante Änderung aufweist.
    Diese wichtigen Punkte werden gesammelt und in die Liste importantData eingefügt.

    Reduktion durch Uniform Sampling:

    Wenn die Anzahl der wichtigen Datenpunkte immer noch größer als die Zielgröße (targetCount) ist, wird die Datenmenge durch gleichmäßiges Sampling weiter reduziert.
    Dabei wird die Schrittgröße berechnet, um gleichmäßig verteilte Datenpunkte aus den wichtigen Punkten auszuwählen.

    Rückgabe:

    Wenn die Anzahl der wichtigen Punkte kleiner oder gleich der Zielgröße ist, werden nur diese wichtigen Punkte zurückgegeben.
    Wenn es zu viele wichtige Punkte gibt, wird die Anzahl durch gleichmäßiges Sampling auf die Zielgröße reduziert.
    In Arbeit...

    Neu

    Ein Tip bezüglich Stepsize und CInt(Math.Floor(i)) Index.

    VB.NET-Quellcode

    1. Dim stepSize = importantData.Count \ targetCount
    2. Dim reducedData As New List(Of Tuple(Of Date, Decimal))()
    3. For i = 0 To importantData.Count - 1 Step stepSize
    4. reducedData.Add(importantData(i))
    5. Next
    \ ist Integer Division. Die macht dasselbe wie / nur dass eben ein abgeschnittener Integer rauskommt.