brauche hilfe bei effektiver sortierung von werten



  • ich habe eine fortlaufende erfassung von messergebnissen, die idealerweise float sind (besser noch integer wo die 2 niedrigsten dezimalstellen nach einem gedachten komma kommen) .... jetzt muss ich die werte effektiv verwalten um anschliessend die Quartile und den Median für einen Boxplot zu bestimmen

    meiner vermutung nach werden vorerst nicht mehr als 20 werte pro verarbeitungszyklus zusammenkommen, kann aber auch schnell mehr werden

    meine idee ist utopisch aber von der rechenzeit her schnell vermutlich ... ich wollte ein array mit 360 (werte von 0 - 360)bytes anlegen und für jeden wert an der entsprechenden position um 1 erhöhen (die nachkommastelle ignorier ich einfach)... anschliessend das array vom kleinsten wert her durchgehen und nachdem ich die quartilgrenzen erreicht habe jeweils den aktuellen index ausgeben bei dem ich mich gerade befinde ... leider hab ich auch nicht so viel speicherkapazität und ohne nachkommastellen zu arbeiten ist gruselig ...

    ich wüsste aber nicht wie ich ansonsten die werte schon beim messen noch effektiver vorsortieren könnte ... ein array zu sortieren fällt auch raus ... eine doppelt verkettete liste scheint mir abenteuerlich vom speicher her (ich rede hier von 2kB ram) sonst würd ich einfach nur qSort oder was in der art nehmen.... ausserdem hab ich noch diverse gleitkommaberechnungen zu tätigen, deren ergebnis dann wie o.g. in integern verfrachtet werden ... konkret gehts dabei um winkelberechnungen

    hat vielleicht jemand ideen, ergänzungen oder anreize ?



  • so ganz versteh ich das noch nicht.

    du hast Messwerte, die prinzipiell mal wie Winkel aussehen und möchtest deren Häufigkeit wissen?

    also da würd ich dann so etwas tun, wie du schon vorgeschlagen hast. Eine Liste von 0 - 359 (beachten! so sinds 360 Werte, bei dir sinds 361) und den Messwert dann da rein sortieren:

    int messwert = (int)getMesswert();
    liste [messwert % 360] ++;
    


  • Da er einen Direktzugriff braucht, ist es wohl eher ein Array.



  • *an den kopf greif

    da waren die finger schneller als das gehirn

    ja ich habs derzeit etwa so gelöst (messwerte sind hier float bzw. doubel)

    float winkelwert = formelvonjemandanderem();
    byte countarray[360];
    int index = (int)winkelwert;
    countarray[index] += 1;
    

    aber die lösung erscheint mir echt zu grob weil ich halt die nachkommastellen ignoriere



  • dann erstelle ein array mit 3600 Werten und multipliziere den Messwert mit 10.

    Alternativ könntest du die Werte per Quicksort in eine Liste einfügen.



  • DocJunioR schrieb:

    dann erstelle ein array mit 3600 Werten und multipliziere den Messwert mit 10. Alternativ könntest du die Werte per Quicksort in eine Liste einfügen.

    Du hast schon gelesen, dass er ein Limit an Speicher hat?

    @Ceos
    Wenn du die Arraygröße nicht erhöhen willst, könntest du doch das Byte in 2 Teile unterteilen und da Werte speichern, die Anzahl ist eben dann auf 2x16 begrenzt. Aber irgendwo musst du eben Abstriche machen wenn du sowenig Speicher zur Verfügung hast. Für was brauchst du das denn überhaupt?



  • die idee mit der unterteilung ist klasse, so könnt ich ,wenn ich den rest des programms effizient hinbekomme, sogar eine nachkommastelle mitnehmen 1800*2 = 3600 .. aber die math lib wird mir garantiert dazwischenfunken wenn ich nur 248 byte ram habe mal abgesehn von einigen anderen kleinigkeiten an variablen die ich beim zählen der liste benötige

    den versuch mit der dynamisch verketteten liste setz ich grad mal testhalber um ... aber es graußt mir ein wenig vor der rechenzeit beim sortieren ... die messwerte sollten idealerweise nur gering schwanken und echte fehler sollten sich SEHR DEUTLICH abheben .. mit der zeit sollten die werte dann aber in eine richtung tendieren

    soll n lebensdauertest werden ...

    vielleicht ist der ansatz des boxplot auch der falsche (*die hobby-statistiker anspricht)

    flaschenhals ist bei der sache die kommunikationsschnittstelle ... ich muss also mehere messwerte sinnvoll komprimieren sodass ich noch aussage über fehlergröße und anzahl treffen kann ohne dass sich die daten anfangen aufzustauen weil die pakete größer werden .. ideal sind immer gleichgroße pakete, daher der ansatz boxplot ... gleitender mittelwert ist anfällig für extremwerte, konfidenzintervalle zur detektierung von fehlern sind auch ne schöne sache aber naja ... wenn der drift stärker ist als erwartet (plötzliches dahinscheiden der hardware) verfälsch ich mir vielleicht meine ergebnisse und habe keine gute aussage mehr über die gemessenen werte während des ausfalls...



  • okay folgende ergebnisse ... mit nem 360° array sinds 290µS zum durchsteppen und ermitteln der werte
    ich werd das ganze jetzt verfeinern, indem ich das array auf 100 oder weniger verkleinere, aus den ersten 20-50 messwerten dann einen erwartungswert und ein konfidenzinterval ermittle, dann setze ich die mitte des array auf den erwartungswert, und die enden des array sind dann das doppelte des vertrauensbereich, so kann ich zumindest über die abweichungen nahe des mittelwert eine gute aussage treffen, alle werte die auserhalb des vertrauensbereich liegen, werden nur gezählt und der maximalwert übermittelt so hab ich ne brauchbare komprimierung und noch ausreichend aussagekräftige werte.


Log in to reply