arrays - vecteur - parcourir matrice matlab



Julia: Trier les colonnes d'une matrice par les valeurs d'un autre vecteur(en place...)? (1)

Je le ferais probablement de cette façon:

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

Cela devrait être assez rapide et utilise seulement un vecteur temporaire et une copie de la matrice. Ce n'est pas entièrement en place, mais faire cette opération complètement sur place n'est pas facile. Vous auriez besoin d'une fonction de tri qui déplace les colonnes en cours de fonctionnement, ou bien une version de permute! Cela fonctionne sur les colonnes. Vous pouvez commencer avec le code pour la permute!! dans combinatorics.jl et le modifier pour permuter les colonnes, en réutilisant un seul tampon temporaire de taille de colonne.

Je suis intéressé à trier les colonnes d'une matrice en termes de valeurs dans 2 autres vecteurs. A titre d'exemple, supposons que la matrice et les vecteurs ressemblent à ceci:

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  ]

Je veux trier les colonnes de A en termes de leurs valeurs correspondantes dans v1 et v2 , avec v1 ayant la priorité sur v2 . De plus, je suis intéressé à essayer de trier la matrice car les matrices avec lesquelles je travaille sont très grandes. Actuellement, ma solution brute ressemble à ceci:

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

ce qui donne le résultat souhaité:

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

Il est clair que mon approche n'est pas idéale car elle nécessite de calculer et de stocker des matrices intermédiaires. Existe-t-il une approche plus efficace / élégante pour trier les colonnes d'une matrice en termes de 2 autres vecteurs? Et peut-il être fait en place pour sauver la mémoire?

Auparavant, j'ai utilisé sortperm pour trier un tableau en termes de valeurs stockées dans un autre vecteur. Est-il possible d'utiliser sortperm avec 2 vecteurs (et sur place)?





julia-lang