Julialang: сортировка на месте для столбцов матрицы - PullRequest
0 голосов
/ 24 августа 2018

У меня огромная матрица, и я хочу отсортировать столбцы на месте для повышения скорости / эффективности памяти.Можно ли использовать сортировку по месту для столбцов матрицы в Юлии?В качестве примера возьмем следующую матрицу:

julia> M=Matrix{Int}(3,3);

julia> for i = 1:size(M)[1]
           for j = 1:size(M)[2]
               M[i,j]=3*(j-1)+i
           end
       end

julia> M
3×3 Array{Int64,2}:
 1  4  7
 2  5  8
 3  6  9

Я хочу использовать сортировку по месту для столбцов, чтобы получить матрицу

3×3 Array{Int64,2}:
 3  6  9
 2  5  8
 1  4  7

Это можно получить без сортировка на месте следующим образом:

julia> M_sorted=Matrix{Int}(3,3);

julia> for j = 1:size(M)[2]
           M_sorted[:,j]=sort(M[:,j],rev=true)
       end

julia> M_sorted
3×3 Array{Int64,2}:
 3  6  9
 2  5  8
 1  4  7

Но что-то подобное не получается (здесь только для одного столбца):

julia> sort!(M[:,1],rev=true)
3-element Array{Int64,1}:
 3
 2
 1

julia> M
3×3 Array{Int64,2}:
 1  4  7
 2  5  8
 3  6  9

Есть ли способ использовать на местесортировать в этом случае?Обратите внимание, что с индексированием проблем нет, поскольку матрица сохраняется в памяти по столбцам:

julia> M[1:end]
9-element Array{Int64,1}:
 1
 2
 3
 4
 5
 6
 7
 8
 9

Так что я думаю, что это должно быть возможно.

1 Ответ

0 голосов
/ 24 августа 2018

Slicing создает копию столбца и сортирует по нему. Если вы вместо этого хотите напрямую отсортировать в памяти существующий массив, используйте представление. Пример:

M=Matrix{Int}(undef,3,3)
for i = 1:size(M)[1]
   for j = 1:size(M)[2]
       M[i,j]=3*(j-1)+i
   end
end

M

3×3 Array{Int64,2}:
 1  4  7
 2  5  8
 3  6  9

sort!(@view(M[:,1]),rev=true)

M

3×3 Array{Int64,2}:
 3  4  7
 2  5  8
 1  6  9
...