数组 – Julia:用另一个向量中的值(就地……)对矩阵的列进行排序?

我感兴趣的是根据2个其他向量中的值对矩阵的列进行排序.举个例子,假设矩阵和向量看起来像这样:

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  ]

我想根据v1和v2中的对应值对A的列进行排序,其中v1优先于v2.此外,我有兴趣尝试对矩阵进行排序,因为我正在使用的矩阵非常大.目前,我的原始解决方案如下所示:

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

这给出了期望的结果:

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

显然,我的方法并不理想,它需要计算和存储中间矩阵.是否有一种更有效/更优雅的方法,用2个其他向量对矩阵的列进行排序?它可以在适当的位置来节省内存吗?

以前我使用sortperm根据存储在另一个向量中的值对数组进行排序.是否可以使用带有2个载体的sortperm(和就地)?

最佳答案
我可能会这样做:

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

这应该非常快,并且只使用一个临时向量和矩阵的一个副本.它并非完全就位,但完全就地进行此操作并不容易.你需要一个排序函数,它可以在列工作时移动列,或者是一个permute版本!适用于列.你可以从代码开始permute !!在combinatorics.jl中并修改它以置换列,重用单个列大小的临时缓冲区.

转载注明原文:数组 – Julia:用另一个向量中的值(就地……)对矩阵的列进行排序? - 代码日志