2011-01-05 11 views
1

Ich versuche etwas zu erstellen, das einem Histogramm ähnelt. Ich versuche Eimer aus einem Array zu erstellen.Zentrieren von Bereichen um Null

Angenommen, ich habe ein zufälliges Array verdoppelt zwischen -10 und 10; Das ist sehr vereinfacht. Ich möchte dann einen Mittelpunkt angeben, in diesem Fall 0 und die Anzahl der Buckets.

Wenn ich 4 Eimer möchte, wäre die Division -10 bis -5, -5 bis 0, 0 bis 5 und 5 bis 10. Nicht so kompliziert richtig. Wenn ich jetzt die Min- und Max-Werte auf -12 und -9 und wie auf 4 Divisionen ändere, ist es komplizierter. Ich will entweder eine Teilung bei -3 und 3; es ist um 0 zentriert; oder eine bei -6 bis 0 und 0 bis 6

Es ist nicht so schwer, die Teilung Größe

= Math.Ceiling((Abs(Max) + Abs(Min))/Divisions) 

Dann finden würden Sie haben grundsätzlich eine if-Anweisung, um zu bestimmen, ob Sie es zentriert auf 0 oder an einer Kante. Je nach Situation iterieren Sie dann entweder von 0 oder von DivisionSize/2. Sie dürfen nicht IMMER mit der angegebenen Anzahl von Divisionen enden, aber es wird in der Nähe sein. Dann durchlaufen Sie das Array und erhöhen die Anzahl der Bins.

Scheint dies eine gute Möglichkeit, dies zu tun? Diese Methode würde sicherlich funktionieren, aber es scheint nicht die eleganteste zu sein. Ich bin gespannt, ob die Erstellung der Bins und das Zählen aus der Liste in eleganter Weise in einer cleveren Klasse mit linq erledigt werden könnte.

So etwas wie die Behälter zu schaffen und dann jedes Fach eine Eigenschaft sein, die {get;}, dass returns list.Count(x=> x >= Lower && x < Upper).

Antwort

0

Mir scheint es einfacher: Sie müssen untere Schranke und die Größe jeder „Division“ zu finden. Da Sie möchten, dass es symmetrisch um 0 ist, abhängig von der Anzahl der Divisionen, erhalten Sie entweder 0 für ungerade Zahlen (-3,3) oder 0 für gerade (-3,0) (0.330)

lowerbound = - Max (Abs (aus), Abs (zu))

bucketSize = 2 * lowerbound/Divisionen

(in Decke werfen und bucketSize und lowerbound aktualisieren, falls erforderlich)

als Einsatz .Aggregate zum Aktualisieren des Arrays von Buckets (Position wäre (Value-lowerBound)/Abstufungen, mit zusätzlichen Bereichsprüfungen, falls erforderlich).

Hinweis: Implementieren Sie nicht so, wie Sie es vorgeschlagen haben - es wird nicht erwartet, dass Getter nicht-triviale Arbeiten wie große Arrays ausführen.

+0

Ich nehme an, Buckets wäre eine Liste , in die Sie indexieren könnten, wie Sie vorschlagen. Das macht Sinn. Ist das Aggregat nur ein .Sum(). Wo()? Sie erklären, wie der aggregierte Teil genauer arbeiten würde. Und danke für deine Antwort. – Mark

Verwandte Themen