online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon sev___ vom 05.09.2019, 20:57 Options

Daten in Arrays sortieren, Histogramm direkt aus Array

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 schreiben

Antwort 1 von Primut vom 05.09.2019, 22:12 Options

Hi sev,

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.
Wie groß ist denn das Array?

Soweit erstmal als Anfang.

Gruß
    Primut

Antwort 2 von sev___ vom 06.09.2019, 09:02 Options

danke dafür schonmal.

das array ist leider ziemlich groß, mindestens 50000 elemente eben...!?!?

Antwort 3 von sev___ vom 06.09.2019, 18:03 Options

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

Antwort 4 von Beverly vom 06.09.2019, 18:31 Options

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

Antwort 5 von sev___ vom 08.09.2019, 14:22 Options

schade, trotzdem danke!

Antwort 6 von Primut vom 09.09.2019, 02:21 Options

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:

...
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)...


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 = False

und entsprechend am Ende:
Application.ScreenUpdating = True


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ß

    Primut

Antwort 7 von sev___ vom 09.09.2019, 16:28 Options

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

Ähnliche Themen

Histogramm
NeuSte  13.09.2007 - 161 Hits -

Arrayproblem
Uesch  02.10.2007 - 97 Hits - 2 Antworten

Problem mit Arrays und Konstanten
Pagestylist  08.11.2007 - 87 Hits - 1 Antwort

(PHP) Array multiplizieren.
bl00dy  09.05.2008 - 55 Hits - 5 Antworten

Excel; Sortieren; 2 Zellen in Verbindung setzen
detommy  19.05.2008 - 149 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 01:23:17 2026