Supportnet / Forum / Tabellenkalkulation
Daten in Arrays sortieren, Histogramm direkt aus Array
Frage
Hallo Forum,
ich hab mal ne schwierige Frage:
und zwar habe ich eine ziemlich aufwändige simulation gemacht (50000 durchläufe). um die rechenzeit zu verkürzen (d.h. um nicht erst alle ergebnisse erst in ein tabellenblatt schreiben)
- will ich ein histogramm direkt aus einem array erstellen
- will ich die daten eines arrays sortieren um zb den 500. kleinsten wert zu bekommen.
geht das irgendwie, kennt sich da jemand aus,
wär klasse, wenn ihr eine lösung für mich habt,
sev
Antwort 1 von Primut
Hi sev,
also sortieren ist ja von der Sache her nicht das Problem, zB so:
wobei Anz die Anzahl der Arrayglieder des zu sortierenden Arr(x) sind.
Evtl. anpassen, ob dein Array bei 1 oder 0 beginnt.
Wenn sich natürlich Werte innerhalb des Arras doppeln, bekommst du schon Probleme,
Wie groß ist denn das Array?
Soweit erstmal als Anfang.
Gruß
also sortieren ist ja von der Sache her nicht das Problem, zB so:
...
For i = 0 To Anz - 1
For k = 0 To Anz - 1
If Arr(k) > Arr(k + 1) Then
Sort = Arr(k)
Arr(k) = Arr(k + 1)
Arr(k + 1) = Sort
Else
End If
Next
Next
...wobei Anz die Anzahl der Arrayglieder des zu sortierenden Arr(x) sind.
Evtl. anpassen, ob dein Array bei 1 oder 0 beginnt.
Wenn sich natürlich Werte innerhalb des Arras doppeln, bekommst du schon Probleme,
Zitat:
zb den 500. kleinsten wert
zu ermitteln.zb den 500. kleinsten wert
Wie groß ist denn das Array?
Soweit erstmal als Anfang.
Gruß
- Primut
Antwort 2 von sev___
danke dafür schonmal.
das array ist leider ziemlich groß, mindestens 50000 elemente eben...!?!?
das array ist leider ziemlich groß, mindestens 50000 elemente eben...!?!?
Antwort 3 von sev___
hab hier was gefunden:
http://www.anthony-vba.kefra.com/vba/excelvba-simulation-102.htm#Hi...
ich muss mir das aber erst nochmal anschauen.
aber wie man ein diagramm direkt aus einem array zeichnet, weiß ich immer noch nicht :-(
sev
http://www.anthony-vba.kefra.com/vba/excelvba-simulation-102.htm#Hi...
ich muss mir das aber erst nochmal anschauen.
aber wie man ein diagramm direkt aus einem array zeichnet, weiß ich immer noch nicht :-(
sev
Antwort 4 von Beverly
Hi,
man kann das Array direkt zuweisen. Das Problem dabei ist jedoch, dass nicht mehr als ca. 200 Zeichen enthalten sein dürfen. Dir bleibt also nichts weiter übrig, als die sortierten Daten aus dem Array in die Tabelle einzutragen und das Diagramm daraus zu erstellen.
Bis später,
Karin
man kann das Array direkt zuweisen. Das Problem dabei ist jedoch, dass nicht mehr als ca. 200 Zeichen enthalten sein dürfen. Dir bleibt also nichts weiter übrig, als die sortierten Daten aus dem Array in die Tabelle einzutragen und das Diagramm daraus zu erstellen.
Bis später,
Karin
Antwort 5 von sev___
schade, trotzdem danke!
Antwort 6 von Primut
Hi Sev,
ich hab natürlich keine Ahnung, was du überhaut berechnen bzw. simulieren willst, aber meine spontane Empfehlung wäre, überhaupt mal eine Abschätzung der Genauigkeit der Berechnung zu machen. Viele Werte liefern nämlich nicht zwangsläufig genauere Ergebnisse, die Genauigkeit hängt zB auch am Rechenansatz / - model mit den entsprechenden Annahmen.
Sei's drum: Zur Sortierung war mein erster Ansatz zwar ok aber zu aufwendig und nur für kleine Arrays sinnvoll. Das Problem der Sortierung besteht darin, dass du jedes Element mit jedem anderen Element der 50000 vergleichen und dann einordnen musst, das ist schon etwas aufwendig.
besserer Sortieransatz:
Arr(x) ist das zu sortierende Array, Sort(y) ist das sortierte Array, ich hab in diesem Beispiel mit 1 als erstes Element angefangen zu zählen. Debug.Print falls du sehen willst, wie schnell er rechnet und an welcher Stelle er gerade ist...
Brauchte bei mir aber zeitmäßig beim Sortiertest mit 50000 Zufallszahlen auch immerhin noch 9 min.
Stimmt so nicht ganz. Wenn du eine Spalte mit 50000 Werten sortierst, geht das wesentlich schneller!
Zeitaufwendig ist das eher, wenn du jeden Wert einzeln in die Zelle schreibst und damit bei jedem Wert die Tabelle aktualisiert werden muss.
Empfehlung:
An den Maktroanfang schreiben:
und entsprechend am Ende:
Zugegeben, ich hab mich bisher noch nicht mit Histogrammen beschäftigt, aber dafür wäre ja wohl interessant, welchen Wertebereich du hast und zB auf wieviel Balken du diesen in welchen Abständen aufteilen willst.
Na ja, soweit erstmal.
Aber wenn du schon eine so aufwendige Simulation machst, dann dürfte doch ein kleines Histogramm nicht mehr das Problem sein, oder?
Gruß
ich hab natürlich keine Ahnung, was du überhaut berechnen bzw. simulieren willst, aber meine spontane Empfehlung wäre, überhaupt mal eine Abschätzung der Genauigkeit der Berechnung zu machen. Viele Werte liefern nämlich nicht zwangsläufig genauere Ergebnisse, die Genauigkeit hängt zB auch am Rechenansatz / - model mit den entsprechenden Annahmen.
Sei's drum: Zur Sortierung war mein erster Ansatz zwar ok aber zu aufwendig und nur für kleine Arrays sinnvoll. Das Problem der Sortierung besteht darin, dass du jedes Element mit jedem anderen Element der 50000 vergleichen und dann einordnen musst, das ist schon etwas aufwendig.
besserer Sortieransatz:
...
Sort(1) = Arr(1)
For i = 2 To 50000
n = 1
OK = False
Do
If Arr(i) >= Sort(i - 1) Then
Sort(i) = Arr(i)
OK = True
Else
If Arr(i) < Sort(n) Then
For k = i - 1 To n Step -1
Sort(k + 1) = Sort(k)
Next
Sort(n) = Arr(i)
OK = True
Else
If Arr(i) >= Sort(n) And Arr(i) <= Sort(n + 1) Then
For k = i - 1 To n + 1 Step -1
Sort(k + 1) = Sort(k)
Next
Sort(n + 1) = Arr(i)
OK = True
Else
n = n + 1
End If
End If
End If
Loop Until OK = True
Debug.Print "i=", i
Next
...
Arr(x) ist das zu sortierende Array, Sort(y) ist das sortierte Array, ich hab in diesem Beispiel mit 1 als erstes Element angefangen zu zählen. Debug.Print falls du sehen willst, wie schnell er rechnet und an welcher Stelle er gerade ist...
Brauchte bei mir aber zeitmäßig beim Sortiertest mit 50000 Zufallszahlen auch immerhin noch 9 min.
Zitat:
...um die rechenzeit zu verkürzen (d.h. um nicht erst alle ergebnisse erst in ein tabellenblatt schreiben)...
...um die rechenzeit zu verkürzen (d.h. um nicht erst alle ergebnisse erst in ein tabellenblatt schreiben)...
Stimmt so nicht ganz. Wenn du eine Spalte mit 50000 Werten sortierst, geht das wesentlich schneller!
Zeitaufwendig ist das eher, wenn du jeden Wert einzeln in die Zelle schreibst und damit bei jedem Wert die Tabelle aktualisiert werden muss.
Empfehlung:
An den Maktroanfang schreiben:
Application.ScreenUpdating = Falseund entsprechend am Ende:
Application.ScreenUpdating = TrueZugegeben, ich hab mich bisher noch nicht mit Histogrammen beschäftigt, aber dafür wäre ja wohl interessant, welchen Wertebereich du hast und zB auf wieviel Balken du diesen in welchen Abständen aufteilen willst.
Na ja, soweit erstmal.
Aber wenn du schon eine so aufwendige Simulation machst, dann dürfte doch ein kleines Histogramm nicht mehr das Problem sein, oder?
Gruß
- Primut
Antwort 7 von sev___
wow danke für deine Mühe und deine lange antwort,
ich brauche schon mindestens 50000 simulationen, weil ich das histogramm so skaliert habe, dass es eine dichtefunktion darstellt (und bei 50000 gibts immernoch keine stetige funktion) und excel hat ja leider nur 65xxx zeilen... excel 2007 hat anscheinend über 1mio hab ich rausgefunden, aber ich denke ich bleibe bei 50000 durchläufen...
Application.ScreenUpdating = False hab ich schon gemacht...
ja ich denke alleine schon die sache mit dem histogramm aus einem array ist zu kompliziert, wie du schon gesagt hast, wegen den wertebereichen zb..
ich lass es so wie es jetzt ist, die simulation dauert bei mir übrigens ca 20 sek, das ist ja eigentlich ganz ok, hab nur gedacht, dass es evtl schneller und sauberer (= im Hintergrund) funktionieren könnte,
danke nochmal für deine Hilfe,
gruß, sev
ich brauche schon mindestens 50000 simulationen, weil ich das histogramm so skaliert habe, dass es eine dichtefunktion darstellt (und bei 50000 gibts immernoch keine stetige funktion) und excel hat ja leider nur 65xxx zeilen... excel 2007 hat anscheinend über 1mio hab ich rausgefunden, aber ich denke ich bleibe bei 50000 durchläufen...
Application.ScreenUpdating = False hab ich schon gemacht...
ja ich denke alleine schon die sache mit dem histogramm aus einem array ist zu kompliziert, wie du schon gesagt hast, wegen den wertebereichen zb..
ich lass es so wie es jetzt ist, die simulation dauert bei mir übrigens ca 20 sek, das ist ja eigentlich ganz ok, hab nur gedacht, dass es evtl schneller und sauberer (= im Hintergrund) funktionieren könnte,
danke nochmal für deine Hilfe,
gruß, sev

