2016-04-18 6 views
1

Wenn ich eine Schleife verwende, um auf die Variablen außerhalb der Schleife zuzugreifen, müssen sie initialisiert werden, bevor Sie die Schleife betreten. Zum Beispiel:Initialisierung der Hist-Funktion in Julia zur Verwendung in einer Schleife

Y = Array{Int}() 
for i = 1:end 
    Y = i 
end 

Da ich Y initialisiert haben, bevor die Schleife eintritt, kann ich es später von

Eingabe zugreifen
Y 

Wenn ich es nicht initialisiert hatte, bevor die Schleife eintritt, die Eingabe Y nicht hätte alles zurückgegeben.

Ich möchte diese Funktionalität auf die Ausgabe der "Hist" -Funktion erweitern. Ich weiß nicht, wie ich die leere Hist-Ausgabe vor der Schleife einrichten soll. Die einzige Arbeit, die ich gefunden habe, ist unten. Jetzt

yHistData = [hist(DataSet[1],Bins)] 

for j = 2:NumberOfLayers 
    yHistData = [yHistData;hist(DataSet[j],Bins)] 
end 

, wenn ich Zugriff auf diese später einfach durch die Eingabe einer

yHistData 

ich die richtigen Werte zu mir zurück. Wie kann ich diese Hist-Daten vor dem Eintritt in die Schleife initialisieren, ohne sie mit dem ersten Wert der Liste, über die ich iteriere, zu definieren?

+0

Es ist nicht klar, was Sie hier zu tun versuchen. Warum brauchen Sie die Schleife und was durchlaufen Sie? Wenn Sie die Histogramm-Bins möchten, können Sie einfach 'hist (vector, bins)' verwenden, um die Slices und Counts zu erhalten. – niczky12

+0

Sie können es mit einem Array der Größe 1 und einer Null 'hist (Nullen (1), Bins) 'initialisieren, ist immer noch nicht klar, was Sie tun möchten. – Esteban

+0

Sie können es mit einem leeren Array wie Ihr erstes Beispiel init, sagen 'yHistData = Array {Any, 1}()' –

Antwort

2

Dies kann mit einer Schleife durchgeführt werden, wie folgt:

durch Zugabe des angegebenen Elements auf das Ende
yHistData = [] 
for j = 1:NumberOfLayers 
    push!(yHistData, hist(DataSet[j], Bins)) 
end 

push! modifiziert das Array. Dies erhöht die Code-Geschwindigkeit, da wir nicht ständig Kopien des Arrays erstellen müssen. Dieser Code ist nett und einfach und läuft schneller als deins. Der Rückgabetyp ist jedoch jetzt Array{Any, 1}, der verbessert werden kann.

Hier habe ich das Array eingegeben, so dass die Leistung bei der Verwendung dieses Arrays in der Zukunft besser ist. Ohne das Array einzugeben, ist die Leistung manchmal besser und manchmal schlechter als Ihr Code, abhängig von NumberOfLayers.

yHistData = Tuple{FloatRange{Float64},Array{Int64,1}}[] 
for j = 1:NumberOfLayers 
    push!(yHistData, hist(DataSet[j], Bins)) 
end 

Unter der Annahme, length(DataSet) == NumberOfLayers können wir anonyme Funktionen verwenden Sie den Code zu vereinfachen noch weiter:

yHistData = map(data -> hist(data, Bins), DataSet) 

Diese Lösung ist kurz, leicht zu lesen, und sehr schnell auf Julia 0,5. Diese Version ist jedoch noch nicht veröffentlicht. Bei 0.4, der aktuell veröffentlichten Version, wird die Leistung dieser Version langsamer sein.

+0

Danke für die Antwort. Ich habe das getestet und kann nicht herausfinden, wie man es in allgemeinen Fällen initialisiert. Zum Beispiel habe ich eine Variable X, von der ich weiß, dass sie ein Array {Float64,2} ist, aber ich weiß nicht, wie die Dimensionen des Arrays in der Schleife sein werden, so dass ich diese nicht vorher spezifizieren kann. Wenn ich Ihre Methode oben, aber ersetzen Sie die [] mit Array {Float64,2} für X (die nicht Histogramm Daten ist) und dann die Schleife eingeben, bekomme ich die Fehlermeldung, dass es eine Dimension nicht übereinstimmt.Gibt es eine Möglichkeit, X vor dem Eintritt in die Schleife zu initialisieren, damit es irgendwelche Dimensionen annehmen kann, sobald es in der Schleife ist? – lara

+0

@ user3061923 Könnten Sie mehr Informationen darüber geben, was Sie unter Dimension verstehen? Meinst du, dass dein Array 3-dimensional oder 4-dimensional sein könnte, oder meinst du, dass es verschiedene Größen annehmen könnte? –

+0

Mein Array, das in der Schleife erstellt wird, kann beispielsweise 3x40 oder 3x30 sein, abhängig von der Anzahl der Datenpunkte, die ich bekomme (entweder 30 oder 40 oder eine beliebige andere Anzahl von Punkten). ABER, innerhalb der Schleife, wenn es zB 3x30 ist, wird jede Iteration immer 3x30 sein, während die Schleife ausgeführt wird. Ich weiß, ich könnte die Länge 3x30 vor der Schleife herausfinden und diese Informationen verwenden, um die leere Arrraygröße zu definieren, um dieses Dimensionskonfliktproblem zu vermeiden, aber ich würde lieber verstehen, wie man dies vermeidet - wie man ein Array vor der Hand ohne initialisiert die genaue Größe für zB Array {Float64,2} (3,30) angeben. – lara