3 votes

Sortperm pour le tri des matrices dans Julia lang

J'utilise Julia 1.6.1.

B est une matrice. Par exemple,

B =
[ 2 4 4 4 5 ;
  1 2 2 3 5 ;
  1 2 3 3 3 ;
  1 2 2 5 6 ;
  1 3 4 4 4 ; ]

Je voulais le trier en forçant sur chaque ligne.

sortedB = sortslices( B, dims=1, rev=true)

Nous obtenons alors B trié

sortedB  =
[ 2 4 4 4 5 ; # 1st row of the original matrix B
  1 3 4 4 4 ; # 5th row of the original matrix B
  1 2 3 3 3 ; # 3rd row of the original matrix B
  1 2 2 5 6 ; # 4th row of the original matrix B
  1 2 2 3 5 ;] # 2nd row of the original matrix B

Je voudrais obtenir le tableau [1 5 3 4 2] . Comment puis-je faire ?

Il semble que sortperm ne fonctionne pas.

sortperm( sortslices( B, dims=1, rev=true) )
# ERROR: MethodError; no method matching sortperm(::Matrix{Int64})

7voto

Przemyslaw Szufel Points 20872

Si les performances sont un problème, utilisez une version non allouante.

julia> sortperm(view.(Ref(B), 1:size(B,1), :), rev=true)
5-element Vector{Int64}:
 1
 5
 3
 4
 2

Voici quelques points de repère using BenchmarkTools :

julia> @btime sortperm(view.(Ref($B), 1:size($B,1), :),rev=true);
  376.471 ns (3 allocations: 432 bytes)

julia> @btime sortperm(collect(eachslice($B,dims=1)),rev=true)
  642.683 ns (6 allocations: 496 bytes);

4voto

MarcMush Points 857

Vous pouvez utiliser eachrow ou eachslice :

julia> C = collect(eachslice(B,dims=1))
5-element Vector{SubArray{Int64, 1, Matrix{Int64}, Tuple{Int64, Base.Slice{Base.OneTo{Int64}}}, true}}:
 [2, 4, 4, 4, 5]
 [1, 2, 2, 3, 5]
 [1, 2, 3, 3, 3]
 [1, 2, 2, 5, 6]
 [1, 3, 4, 4, 4]

julia> sortperm(C,rev=true)
5-element Vector{Int64}:
 1
 5
 3
 4
 2

bien que cela alloue plus que nécessaire ( collect est nécessaire apparemment)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X