2016-06-24 13 views
2

Ich habe einen Vektor von Zufallszahlen, die ich zufällig per randperm() -Funktion wie folgt permieren will, aber es funktioniert nicht.JULIA: Wie man zufällig einen Vektor in Julia permutiert?

X=rand(100000) # a vector of 100000 random elements 
Y=randperm(X) # want to permute randomly the vector x 

der zurückgegebene Fehler ist: ERROR: MethodError: keine Methode Anpassungs randperm (:: {Float64,1 Array}) in eval (:: Module, :: Any) bei ./boot.jl : 237

Danke

+0

weil randperm() auch in Matlab und Julia Sprache verwendet wird, ist ein Kompromiss zwischen Matlab und Python. eigentlich ist die Funktion die gleiche, aber ich weiß nicht, warum es nicht funktioniert – vincet

Antwort

8

Basierend auf dem docs der randperm() eine ganze Zahl akzeptiert n und eine Permutation der Länge n gibt. Sie können diese Reihenfolge verwenden, um dann Ihre ursprünglichen Vektor neu ordnen:

julia> X = collect(1:5) 
5-element Array{Int64,1}: 
1 
2 
3 
4 
5 

julia> Y = X[randperm(length(X))] 
5-element Array{Int64,1}: 
3 
4 
1 
2 
5 

Sie können jederzeit die Dokumentation überprüfen, indem ?function_name in der REPL eingeben.

Wenn Ihr einziges Ziel zufällig ist es, den Vektor permutieren, können Sie auch shuffle() verwenden:

julia> shuffle(X) 
5-element Array{Int64,1}: 
5 
4 
1 
2 
3 
+0

Vielen Dank, ich habe gerade begonnen, Julia zu lernen. Ich schätze Ihre Hilfe. – vincet

2

auf dem zweiten Punkt huckepack in der Antwort @ niczky12, wenn Sie nach dem Zufall wollen den Vektor permutieren X direkt, dann ist es tatsächlich effizientes shuffle!(X) statt shuffle(X) zu nennen:

# precompile @time 
@time 1+1 

# create random vector 
p = 10_000 
X = collect(1:p) 

# reproducible shuffles 
srand(2016) 

shuffle(X) 
@time shuffle(X) 

shuffle!(X) 
@time shuffle!(X) 

Ausgang auf meinem Rechner:

0.000004 seconds (148 allocations: 10.151 KB) 
    0.000331 seconds (6 allocations: 78.344 KB) 
    0.000309 seconds (4 allocations: 160 bytes) 

Der Aufruf an shuffle! reserviert wesentlich weniger Speicher (160 Bytes v. 78 Kb) und wird daher besser mit skalieren.

+1

Verwenden Sie beim Benchmarking keine globalen Variablen, sondern alles in eine Funktion. Sie können auch das BenchmarkTools-Paket verwenden –

+0

Oh, vielleicht ist es hier nicht wichtig, aber –

+0

Es sollte hier keine Rolle spielen, da ich Speicherzuordnungen vergleichen und nicht Zeiten berechnen wollte. Es ist eine gute Julia-Programmierpraxis, alles in Funktionen zu verpacken. Auf meinem Computer ändert das Wrapping des Skripts in einer Funktion das Ergebnis nicht. –