Mathematik Datenreihe ausdünnen

Liebe/-r Experte/-in,

Datenreihe ausdünnen

Hallo. Ich habe folgendes, auf Anhieb einfach ausschauendes Problem. Mir werden Daten an ein Serverprogramm gesendet. Daraus ergibt sich eine Datenreihe beliebiger Grösse. Von diesen Daten möchte ich immer 100 Werte in eine Datenbank schreiben. Ich möchte die Daten nicht einfach begrenzen, sondern die 100 Werte gleichmässig über die Gesamtmenge verteilen. Beispiel für 150 Werte:
150-100=50, also 50 Werte ignorieren
=> 150/50 = 3 => jeden dritten Wert ignorieren.
Soweit sogut. Aber wie kann ich das allgemeingültig machen?
Eine Schrittweite ist ungünstig:
100 Werte Schrittweite 1 => 100/1 = 100 ok
101 Werte Schrittweite 2 => 101/2 = 50 ergibt einen Messwert mehr, dafür 50 Werte weniger in der Datenbank, nicht gut. Wie komme ich an die 100 oder wenigstens möglichst nahe an die 100?
Ich suche eine Lösung als Algorithmus, weil ich es programmieren will.
Danke für jede Antwort

Bedaure, diese Frage kann ich nicht beantworten.
B.Kaiser

Gewünschte Werte: n
Eingehende Werte: m
Schrittweite s = n/m

Für jeden eingehenden Wert:
Index des eingehenden Wertes: i
Anzahl der bisher verwendeten Werte: v
Wenn i*s > v, dann verwenden, sonst ignorieren.

Evtl. macht es Sinn, i*s zu runden und/oder statt > >= zu verwenden. Musste mal n bisschen rumprobieren.

Grüße

gewünscht 100
eingehen 131
s = 0.76
v = 0
for ( i=1; i 0 also speichern, v hochzählen
2*1 " " > 1 " " "
}
So werden alle 131 Werte gespeichert oder hab ich das falsch verstenden.

Dachte so: 131/31 = 4
i: 1…131
wenn i%4 = 0 => Wert ignorieren. Passt hier schon, aber bei 181 Fehlanzeige :frowning:

Aber danke für die schnelle Mail.

Du hast im zweiten Schritt 2*1 gerechnet, aber ich hatte ja formuliert, i*s zu runden und nicht i* gerundetes s. 2*0.76 = 1.52 (gerundet 1 oder 2), 3*0.76 = 2.28 (gerundet 2)

Sorry, falsch versteht :smile:) Ich sehs mir an, danke

Du hast im zweiten Schritt 2*1 gerechnet, aber ich hatte ja
formuliert, i*s zu runden und nicht i* gerundetes s. 2*0.76 =
1.52 (gerundet 1 oder 2), 3*0.76 = 2.28 (gerundet 2)

Hallo. Ich habe folgendes, auf Anhieb einfach ausschauendes
Problem. Mir werden Daten an ein Serverprogramm gesendet.
Daraus ergibt sich eine Datenreihe beliebiger Grösse. Von
diesen Daten möchte ich immer 100 Werte in eine Datenbank
schreiben. Ich möchte die Daten nicht einfach begrenzen,
sondern die 100 Werte gleichmässig über die Gesamtmenge
verteilen. Beispiel für 150 Werte:
150-100=50, also 50 Werte ignorieren
=> 150/50 = 3 => jeden dritten Wert ignorieren.
Soweit sogut. Aber wie kann ich das allgemeingültig machen?
Eine Schrittweite ist ungünstig:
100 Werte Schrittweite 1 => 100/1 = 100 ok
101 Werte Schrittweite 2 => 101/2 = 50 ergibt einen Messwert
mehr, dafür 50 Werte weniger in der Datenbank, nicht gut. Wie
komme ich an die 100 oder wenigstens möglichst nahe an die
100?
Ich suche eine Lösung als Algorithmus, weil ich es
programmieren will.
Danke für jede Antwort

Wenn du n Werte hast und m behalten willst, würde ich folgenden Algorithmus verwenden: Du verwaltest einen Akkumulator k, der mit dem Wert n startet. Dann gehst du durch die Eingabeliste mit den n Werten. Für jeden Eingabewert vergleichst du k mit n.
Ist k>=n, dann übernimmst du den Eingabewert und verringerst k um n. Ist k let sieve n m = Data.Maybe.catMaybes . snd . Data.List.mapAccumL (\k x -> let l=k+m in if k>=n then (l-n, Just x) else (l, Nothing)) n
Prelude> sieve 100 30 [‚a‘…‚z‘]
„aehkoruy“

Danke. Ich werd’s in c ausprobieren.