vectores repeticiones multiplicacion matrices listas elementos ejemplos data contar concatenar agregar arrays sorting matrix julia-lang

arrays - repeticiones - Julia: ordena las columnas de una matriz por los valores en otro vector(en su lugar...)?



multiplicacion de matrices en r (1)

Probablemente lo haría de esta manera:

julia> cols = sort!([1:size(M,2);], by=i->(v1[i],v2[i])); julia> M[:,cols] 3×6 Array{Int64,2}: 4 6 1 5 2 3 10 12 7 11 8 9 16 18 13 17 14 15

Esto debería ser bastante rápido y usa solo un vector temporal y una copia de la matriz. No está completamente en su lugar, pero hacer esta operación completamente en su lugar no es fácil. ¡Necesitarías una función de clasificación que mueva columnas mientras funciona, o alternativamente una versión de permute! eso funciona en columnas ¡Podrías comenzar con el código de permute!! en combinatorics.jl y modifíquelo para permutar columnas, reutilizando un único búfer temporal de tamaño de columna.

Estoy interesado en ordenar las columnas de una matriz en términos de los valores en otros 2 vectores. Como ejemplo, supongamos que la matriz y los vectores se ven así:

M = [ 1 2 3 4 5 6 ; 7 8 9 10 11 12 ; 13 14 15 16 17 18 ] v1 = [ 2 , 6 , 6 , 1 , 3 , 2 ] v2 = [ 3 , 1 , 2 , 7 , 9 , 1 ]

Quiero ordenar las columnas de A en términos de sus valores correspondientes en v1 y v2 , con v1 tomando precedencia sobre v2 . Además, estoy interesado en tratar de ordenar la matriz en su lugar ya que las matrices con las que estoy trabajando son muy grandes. Actualmente, mi solución bruta se ve así:

MM = [ v1'' ; v2'' ; M ] ; ## concatenate the vectors with the matrix MM[:,:] = sortcols(MM , by=x->(x[1],x[2])) M[:,:] = MM[3:end,:]

que da el resultado deseado:

3x6 Array{Int64,2}: 4 6 1 5 2 3 10 12 7 11 8 9 16 18 13 17 14 15

Claramente, mi enfoque no es ideal, ya que requiere la computación y el almacenamiento de matrices intermedias. ¿Existe un enfoque más eficiente / elegante para clasificar las columnas de una matriz en términos de otros 2 vectores? ¿Y se puede hacer para salvar la memoria?

Anteriormente utilicé sortperm para ordenar una matriz en términos de los valores almacenados en otro vector. ¿Es posible usar sortperm con 2 vectores (y en el lugar)?