Gast
#1373596
Hallo, ich bekomme ca. 1000 float Messwerte pro Sekunde. In einem array möchte ich mir die 5 kleinsten Werte dieser 1000 Werte ablegen. Wie könnte man das in C am effektivsten lösen? Michael
|
Anzeige
|
die 5 kleinsten werte rausfiltern
Gast
#1373596
Hallo, ich bekomme ca. 1000 float Messwerte pro Sekunde. In einem array möchte ich mir die 5 kleinsten Werte dieser 1000 Werte ablegen. Wie könnte man das in C am effektivsten lösen? Michael Müde zusammengehackt und ohne Gewähr. Und nicht für alle Fälle geeignet (z.B wenn ein Messwert gleich X ist und alle 999 anderen Messwerte gleich Y) denke ich. Gehe jetzt ins Bett, N8
Michael schrieb: > Hallo, > > ich bekomme ca. 1000 float Messwerte pro Sekunde. In einem array möchte > ich mir die 5 kleinsten Werte dieser 1000 Werte ablegen. Wie könnte man > das in C am effektivsten lösen? Was ist wenn Messwerte doppelt auftreten? Benötigst du dann die 5 kleinsten Messwerte die unterschiedliche Werte haben oder die 5 tatsächlich kleinsten Werte? Bsp für 2 Deine Messreihe sei 4 5 2 4 5 2 sind die beiden kleinsten Werte 2 2 oder sind sie 2 4
Gast
#1373775
Hallo, es sollten die 5 kleinsten sein, in deinem Beispiel: 2 2 Michael schrieb: > Hallo, > > es sollten die 5 kleinsten sein, in deinem Beispiel: 2 2 Würd ich dann so machen Ein kleines Array mit 5 Einträgen. Aufgabe des Arrays: die 5 Werte halten, wobei die 5 Werte in diesem Array aufsteigend sortiert sind.
So in etwa. Was natürlich auch zu überlegen wäre, wenn du den Platz hast: sortieren und die ersten 5 nehmen.
Gast
#1374407
Hallo Karl Heinz, besten Dank, so funktioniert das jetzt ganz gut.
Gast
#1376946
Hallo, da ist doch noch ein Fehler bei meiner Umsetzung. Es sind zu wenig Punkte nach der Berechnung in der Liste. In meinem Beispiel sind 47 Koordinaten kleiner MAXDIST, es sind aber nur 14 in der LIste.
Michael schrieb: > if( distance > results[LISTSIZE-1][0] ) continue; > Die ganze Idee an diesem Shortcut ist es, die Vergleichsschleife einzusparen. Wenn du 5 Punkte bisher gefunden hast, mit den Distanzen 10, 11, 12, 13, 14 und du hast eine neue Distanz 25, also einem Wert, der größer ist als das bisherige Maximmum aller kleinsten Distanzen, dann kann diese Distanz nicht in das Minimalarray gehören. Daher ist dann der folgende Vergleichs und Suchlauf überflüssig. Es handelt sich daher um einen quick&dirty Vortest, der nur dazu da ist, schnell zu entscheiden, ob diese zu testende Distanz überhaupt eine Chance hat irgendetwas in den bisher gefundenen Minima zu bewirken. Wieviele Einträge umfasst den eigentlich das results Array zu jedem beliebigen Zeitpunkt. Nun, die Anzahl davon steht in nbPoints. > nbPoints++; Warum rückst du hier ein? Im Ernst: das kann nicht stimmen. Stell dir einfach mal vor, was ganz am Anfang passiert. Das results array ist leer. Wenn du jetzt an dieser Stelle nbPoints erhöhst, dann versucht der folgende Programmteil die Distanz mit einem imaginären Punkt zu vergleichen, der noch gar nicht in der Liste ist. Darf ich vorschlagen, dass du deine Kennzahlen einfach einmal drastisch runterfährst (es macht keinen Sinn erste Tests mit Unmengen an Daten zu fahren) und dann das Zeugs im Debugger mal durchzusteppen. Am besten konstruierst du dir ein Beispiel auf dem Papier und schaust dir am Papier an was eigentlich rauskommen müsste (und auch warum). Dann vergleichst du, was dein Programm macht (durchaus auch im Debugger) und warum. Dann wirst du auch deine Fehler finden. Aber mit 1000 Datensätzen von denen 100 gesucht werden kann man nicht vernünftig debuggen. Dazu reichen 10 Datensätze von denen 3 oder 4 gesucht werden allemal.
Ähm. Nach hinten schieben. ... Wieso dann k-1? Hinten ist bei einem Array k+1
Gast
#1377336
ok, ich habs gefunden.
Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|