2017-03-26 3 views
3

ベクトルz = [1, 2, 3]が与えられたら、私はすべての円順列がz(すなわちzp = [[1,2,3], [3,1,2], [2,3,1]])のベクトルのベクトルを作成したいと思います。円順列

私は結果の順列を保存することができますどのように

for i in 1:length(z) 
    push!(z, shift!(z)) |> println 
end 

zpのすべての要素を印刷することができますか?それはzpに同じベクトルにz 3回を保存するよう

zp = Vector(length(z)) 
for i in 1:length(z) 
    push!(z, shift!(z)) 
    push!(zp, z) 
end 

が動作しないことに注意してください。

答えて

7

一つの方法は、それをプッシュする前にベクトルをコピーするには、次のようになります。

z = [1, 2, 3]; 

zp = Vector(); 
for i in 1:length(z) 
    push!(z, shift!(z)) 
    push!(zp, copy(z)) 
end 

は私に

julia> zp 
3-element Array{Any,1}: 
[2,3,1] 
[3,1,2] 
[1,2,3] 

を与えるしかし、私はときに私ができる変異操作を避け好む傾向にあります。だから私は、代わりに

julia> zp = [circshift(z, i) for i=1:length(z)] 
3-element Array{Array{Int64,1},1}: 
[3,1,2] 
[2,3,1] 
[1,2,3] 
+0

私は私が使用する、circshift' '知りませんでした代わりに。 – amrods

+1

アプリケーションが循環シフトのために重複配列を使用できる場合は、次のようになります: 'allcircular(v)= begin v2 = repmat(v、2); L =長さ(v)。 [view(v2、i:i + L-1)for i = 1:L];終わりはトリックを行います。それは答えの2倍の速度で実行され、長いアレイではより少ないメモリしか使用できません。しかし、データが読み取り専用でない場合、重複する条件は非常にエラーを起こしやすい。 –

+0

@DanGetz:nice!私は過去にストライドトリックを使用して問題に悩まされました。このようなアクセスは、コード内のクリティカルパスのボトルネックになることはほとんどありません。しかし、それはまだかなり滑らかです。 :-) – DSM

3

としてこれを書きたいこれが(理解力よりも速い)私のマシンではかなり迅速に実行するようだ:

julia> z=[1,2,3] 
3-element Array{Int64,1}: 
1 
2 
3 

julia> zp=Vector{typeof(z)}(length(z)) 
3-element Array{Array{Int64,1},1}: 
#undef 
#undef 
#undef 

julia> for i=1:length(z) 
     zp[i]=circshift(z,i-1) 
     end 

julia> zp 
3-element Array{Array{Int64,1},1}: 
[1,2,3] 
[3,1,2] 
[2,3,1] 

julia>