sinnvoll sind auch Stückelungen im 2^x Bereich, sprich
2, 4, 8, 16, 32, 64 etc.
Das erspart einem u.U. ne menge Rechenzeit, man kann sich das
Summe/2 sparen indem man einfach shift Summe, right,1 (2, 3, 4, etc.) macht.
Druckbare Version
sinnvoll sind auch Stückelungen im 2^x Bereich, sprich
2, 4, 8, 16, 32, 64 etc.
Das erspart einem u.U. ne menge Rechenzeit, man kann sich das
Summe/2 sparen indem man einfach shift Summe, right,1 (2, 3, 4, etc.) macht.
man könnte ja auch den Mittelwert errechnen (nicht den arrithmetischen) der ist sehr unempfindlich gegen extremwerte ... einfach 100 werte aufzeichnen und den mittelwert bestimmen
mit nem array kann man das sogar sehr recheneffizient machen wenn der ewrtebereich und die auflösung nicht zu groß gewählt werden ...
Du meinst so wie das am Anfang des Threads schon mal Beschrieben wurde? ;-)Zitat:
man könnte ja auch den Mittelwert errechnen (nicht den arrithmetischen) der ist sehr unempfindlich gegen extremwerte ... einfach 100 werte aufzeichnen und den mittelwert bestimmen
Womit wir dann wohl endgültig wieder zum Ausgangspunkt des Threads zurückkommen ;-)Zitat:
mit nem array kann man das sogar sehr recheneffizient machen wenn der ewrtebereich und die auflösung nicht zu groß gewählt werden ...
naja nicht ganz, ich habs so verstanden, dass er werte aufzeichnet und dann aufaddiert und durch die anzahl teilen will ?! DAS ist natürlich unperformant
mir geht es um den echten mittelwert und nicht um das arithmetische mittel wegen der extremwerte .. problematsich ist aber dass der übliche weg zur mittelwertbestimmung über nen sortieralgo geht und das frisst zeit
ihc hab ne lösung die die auflösung auf den verfügbaren speicher begrenzt
was ich meine ist z.B. ein array mit 100mal 1byte
und über dann den index zu arbeiten mit einer einfachen addition um zeit zu sparen, anschließend noch das array durchzählen und man hat seinen mittelwert
ich erkläre es nochmal mit code, der letze satz geht nur mit viel fantasie
ein 100er-array für eine angabe von 0-100 Liter ohne komma
Code:unsigned char maray[100];
while(messen)
{
marray[getFüllstandInLiter()]++;
count++;
if(ausgabe) {
unsigned in mid = count/2;
for(int i = 0; i < 100; i++) {
count-=marray[i];
if(count < mid) {
print(mid);
clearArrayAndCounter();
}
}
}
}
Für die Anwendung im µC ist das eher unpraktisch, da man oft wenig SRAM hat. Vor allem wenn man mehr als 100 mögliche Werte hat.
Der was hier "echter Mittelwert" genannt wurde ist der Median. Für einige Fälle mit größeren Ausreißern hat das wirklich vorteile, ist aber halt Rechenzeitintensiv und ggf. braicht oft auch viel Speicherplatz.
Eine Alternative wäre es echte Ausreißer durch einen Plausibilitätstest rauszuschmeißen, und dann den Rest zu mitteln. Wenn die Zahl der Messwerte groß ist, stört es auch kaum, wenn kleinere Ausreißer drin bleiben.