2016-06-24 22 views
2

は、以下のようにrandperm()関数を使って無作為に並べ替える乱数のベクトルを持っていますが、動作しません。ジュリア:ジュリアのベクトルをランダムに並べ替える方法は?

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

返されたエラーがある: ERROR:MethodError:いいえ方法マッチングrandperm(::配列{Float64,1}) 評価における(::モジュール::任意)./boot.jlで:237

ありがとうdocsrandperm()に基づいて

+0

randperm()もmatlabとjulia言語で使用されているので、matlabとpythonのトレードオフです。実際には機能は同じですが、なぜ機能していないのか分かりません。 – vincet

答えて

8

は整数nを受け入れ、長さnの順列を与えます。次に、あなたの元のベクトルを並べ替えるために、この順序付けを使用することができます。

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 

あなたは常にREPLで?function_nameを入力してドキュメントをチェックすることができます。

あなたの唯一の目標は、ランダムにベクトルを置換するためにある場合は、shuffle()を使用することができます。

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

多くの方に感謝します。ちょうどjuliaを学び始めました。あなたの助けに感謝します – vincet

2

あなたは、ランダムにベクトルXを入れ替えたい場合は、@ niczky12によって答えで第二の点に便乗するには直接それが代わりにshuffle(X)shuffle!(X)を呼び出すために、実際に、より効率的である:私のマシン上

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

出力:

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

shuffle!を呼び出すと、実質的に少ないメモリ(160バイト対78Kb)が割り当てられるため、pの方がよりスケーラビリティが向上します。

+1

ベンチマーク時にグローバル変数を使用せず、関数内のすべてをラップします。 BenchmarkToolsパッケージ –

+0

を使用することもできます。ここでは関係ないかもしれませんが –

+0

メモリ割り当てを比較して計算時間を比較しようとしていたので、ここでは問題にはなりません。関数内のすべてをラップするのは、Juliaコーディングの練習です。私のマシンでは、スクリプトを関数にラップしても結果は変わりません。 –

関連する問題