2012-04-05 12 views
0

Ich bin neu in Mathematica und ich habe Schwierigkeiten mit einer Sache. Ich habe diese Tabelle, die 10 000 mal 13 Zahlen generiert (12 Zahlen + 1, die eine Startnummer ist). Ich muss ein Histogramm aus allen 10 000 13. Nummern erstellen. Ich hoffe, es ist ziemlich klar, ziemlich schwierig zu erklären.Wie wählt man die letzte Spalte von Zahlen aus einer Tabelle erstellt von FoldList in Mathematica

Dies ist die Tabelle:

F = Table[(Xi = RandomVariate[NormalDistribution[], 12]; 
Mu = -0.00644131; 
Sigma = 0.0562005; 
t = 1/12; s = 0.6416; 
FoldList[(#1*Exp[(Mu - Sigma^2/2)*t + Sigma*Sqrt[t]*#2]) &, s, 
Xi]), {SeedRandom[2]; 10000}] 

Das Ergebnis für das folgende Histogramm könnte eine Tabelle, die alle 13 Nummern an einen Tisch nehmen - als es ganz einfach wäre, ein Histogramm zu erstellen. Vielleicht mit "auswählen"? Oder vielleicht kennen Sie andere Möglichkeiten, dies zu lösen.

+1

Ist das, was Sie wollen: 'Histogramm [Letzter/@ F]'? – mohit6up

+0

Vielen Dank - ich habe K = F [[All, 13]] gefunden, aber das ist viel besser, thx! – seniorita

+0

'F [[All, -1]]' würde auch funktionieren. – Heike

Antwort

2

können Sie verschiedene Teile einer Liste zugreifen Part mit oder (je nachdem, was Teile, die Sie benötigen) einige der spezielleren Befehle wie First, Rest, Most und (die Sie benötigen) Last. Wie in den Kommentaren erwähnt, Histogram[Last/@F] oder Histogram[F[[All,-1]]] wird gut funktionieren.

Obwohl es nicht Teil Ihrer Frage war, möchte ich einige Dinge notieren, die Sie für Ihr spezifisches Problem tun könnten, die es enorm beschleunigen werden. Sie definieren Mu, Sigma usw. 10.000 Mal, weil sie sich innerhalb des Befehls Table befinden. Sie berechnen auch Mu - Sigma^2/2)*t + Sigma*Sqrt[t] 120.000 mal neu, obwohl es eine Konstante ist, weil Sie es innerhalb der FoldList innerhalb der Table haben.

Auf meinem Rechner:

F = Table[(Xi = RandomVariate[NormalDistribution[], 12]; 
    Mu = -0.00644131; 
    Sigma = 0.0562005; 
    t = 1/12; s = 0.6416; 
    FoldList[(#1*Exp[(Mu - Sigma^2/2)*t + Sigma*Sqrt[t]*#2]) &, s, 
     Xi]), {SeedRandom[2]; 10000}]; // Timing 

{4.19049, Null} 

Diese Alternative ist zehnmal schneller:

F = Module[{Xi, beta}, With[{Mu = -0.00644131, Sigma = 0.0562005, 
     t = 1/12, s = 0.6416}, 
    beta = (Mu - Sigma^2/2)*t + Sigma*Sqrt[t]; 
    Table[(Xi = RandomVariate[NormalDistribution[], 12]; 
     FoldList[(#1*Exp[beta*#2]) &, s, Xi]), {SeedRandom[2]; 
     10000}] ]]; // Timing 

{0.403365, Null} 

I With für die lokalen Konstanten und Module für die Dinge, die innerhalb der Table umdefiniert andere sind (Xi) oder basieren Berechnungen auf den lokalen Konstanten (beta). This question on the Mathematica StackExchange wird helfen zu erklären, wann Module gegenüber Block gegenüber With zu verwenden ist. (Ich ermutige Sie, den Mathematica StackExchange weiter zu erforschen, da die meisten Mathematica-Experten gerade hier herumhängen.)

Für Ihren spezifischen Code ist die Verwendung von Part nicht wirklich erforderlich. Verwenden Sie statt FoldList einfach Fold. Es behält nur die letzte Zahl in der Faltung bei, die mit der letzten Zahl in der Ausgabe von FoldList identisch ist. So könnten Sie versuchen:

FF = Module[{Xi, beta}, With[{Mu = -0.00644131, Sigma = 0.0562005, 
     t = 1/12, s = 0.6416}, 
    beta = (Mu - Sigma^2/2)*t + Sigma*Sqrt[t]; 
    Table[(Xi = RandomVariate[NormalDistribution[], 12]; 
     Fold[(#1*Exp[beta*#2]) &, s, Xi]), {SeedRandom[2]; 
     10000}] ]]; 

Histogram[FF] 

Berechnung FF auf diese Weise sogar ein wenig schneller als die Vorgängerversion. Auf meinem System Timing berichtet 0,377 Sekunden - aber eine solche Differenz von 0,4 Sekunden ist kaum erwähnenswert.

enter image description here

Da Sie die Samen mit SeedRandom setzen, ist es einfach, dass alle genau die gleichen Ergebnisse liefern drei Codebeispiele zu überprüfen.

0

machen mein Kommentar eine Antwort: Histogram[Last /@ F]