Sortperm 用于 Julia lang 中的矩阵排序

Sak*_*.JJ 3 sorting matrix julia

我正在使用 Julia 1.6.1。

B是一个矩阵。例如,

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 ; ]
Run Code Online (Sandbox Code Playgroud)

我想对每一行进行强制排序。

sortedB = sortslices( B, dims=1, rev=true)
Run Code Online (Sandbox Code Playgroud)

然后,我们得到排序B

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 ; ]
Run Code Online (Sandbox Code Playgroud)

我想得到数组[1 5 3 4 2]。我怎样才能做到这一点 ?

看来这sortperm不行。

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

Prz*_*fel 7

如果性能是一个问题,请使用非分配版本。

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

以下是一些基准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);
Run Code Online (Sandbox Code Playgroud)