Im Array eine Queue speichern und fortlaufend aktualisieren



  • Hallo,

    eine Funktion liest in ein float64 pro Zyklus 20 Werte. Für mich sind immer nur die Werte von 0 - 9 interessant.

    Ich möchte die ersten 10 Werte je Zyklus nun in ein anderes Array schreiben, in dem ich z.B. insgesamt 100 Werte speichern kann.
    Wenn das Array voll ist, sollen die ältesten Werte durch die neuen ersetzt werden.
    Außerdem soll ein Mittelwert des Array berechnet werden (aber erst, wenn es voll ist, da sonst sämtliche Nullen den Mittelwert runterziehen).

    So, dass ich dann immer den Mittelwert der letzten 100 Messungen habe.

    Ich hoffe, ich konnte es einigermaßen erklären.



  • erst ganzes array auf 0 setzen.

    //neuen wert speichern:
    summe-=arr[schreibindex];
    arr[schreibindex]=neuerWert;
    summe+=arr[schreibindex];
    ++schreibindex;
    if(schreibindex==100)
       schreibindex=0;
    durchschnitt=summe/100;
    

    Su haste immer den Mittelwert der letzten 100 Messungen. Außer bei den ersten 99 Mesungen, da lügt er noch.



  • Vielen Dank schonmal,

    das sollte doch dann so funktionieren, wenn im Messarr immer die ersten Zehn Werte [0-9] pro Zyklus mit Messwerten belegt werden.

    //neuen wert speichern:
    
    for (zaehler=0; zaehler<10; zaehler++){
       summe-=arr[schreibindex];
       arr[schreibindex]=Messarr[zaehler];
       summe+=arr[schreibindex];
       schreibindex++;
       if(schreibindex==99) {
           schreibindex=0;
           stickybit=1;
           }         
       durchschnitt=summe/100;
       }
    

    Für 100 Werte muss doch in die if-Schleife 99 oder? Weil er in die 0 ja auch was schreib.

    Mit dem stickybit kann ich doch dann an einer anderen Stelle im Programm sehen, dass mein Array jetzt voll ist und ich nun einen wirklichen Mittelwert bekomme (wenn der Mittelwert durch die Nullen verfälscht ist, beeinflusst das meine Regelung).


  • Mod

    Mustermann schrieb:

    Für 100 Werte muss doch in die if-Schleife 99 oder? Weil er in die 0 ja auch was schreib.

    Nein. Versuch mal, die Werte mit Zettel und Stift nach zu vollziehen. Vielleicht mit einer kleineren Zahl, wie 10, als Maximum.

    Außerdem relevant: www.if-schleife.de



  • Ja, ich denke ich hab es 🙂

    Weil ich ja vor der if-Abfrage den Wert erhöhe.

    Aber der Rest dürfte ja funktionieren...



  • Mustermann schrieb:

    Für 100 Werte muss doch in die if-Schleife 99 oder? Weil er in die 0 ja auch was schreib.

    Uih, das ist sowas, das kann ich nie abschätzen.
    http://de.wikipedia.org/wiki/Off-by-one-Error

    Ich probiere es im Kleinen aus wie SeppJ vorschlägt oder teste es mit einem Testprogramm oder so. Ganz gefährliche Sache das, da verlasse ich mich nie auf Vermutungen.

    edit: Hey, ich hab doch 100 vorgemacht. Da hatte ich nicht überlegt, das floß von selber in die Tastatur, Standardlösung halt. Als Du nachfragtest, war ich aber verwirrt.

    edit2: durchschnitt=summe/100; kann auch gerne hinter die for(10)-Schleife.



  • Mustermann schrieb:

    Außerdem soll ein Mittelwert des Array berechnet werden (aber erst, wenn es voll ist, da sonst sämtliche Nullen den Mittelwert runterziehen).

    Warum? Nach dem ersten Schlag kannste doch schon den Mittewert der ersten 10 nehmen. Außerdem brauchst Du nicht 100 Werte zu speichern, 10 reichen. Das Code ich jetzt mal kurz nicht. 😃

    Wenn Du rumregelst, bist sicher, daß die letzten 10 10-er-Päckchen gleich wichtig sind oder sollten die aktuelleren stärker gewichtet sein? Ich benutze saugerne sowas, wo alle alten Werte drin bleiben, aber sie mit dem alter exponentiell an Einfluß verlieren.

    double traegkeit=0.1;//zwischen 0 und 1
    
    double messWert10=0;
    for (i=0; i<10; i++){
       messWert10+=Messarr[i];
    }
    messWert10/=10;
    
    if(stickbit==0){
       stickybit=1;
       durchschnitt=messWert10;
    }
    else{
       durchschnitt=messWert10*(1-traegheit)+durchschnitt*traegheit;
    }
    


  • Falls es statt 100 Werten auch z.B. 128 sein dürfen, kann man statt

    schreibindex++;
    if(schreibindex==128) 
    {
        schreibindex=0;
    }
    

    auch schön

    ++schreibindex &= 127;
    

    schreiben. (Das mit Deinem sticky geht dann so natürlich nicht.)



  • Schock schrieb:

    auch schön

    ++schreibindex &= 127;
    

    schreiben.

    Ach, in C braucht man auf sequence points nicht zu achten?



  • Äääh, machen wir vll. lieber ein

    ++schreibindex;
    schreibindex &= 127;
    

    draus. 🤡


Anmelden zum Antworten