gpt4 book ai didi

arrays - Julia :按另一个向量中的值对矩阵的列进行排序(就位...)?

转载 作者:行者123 更新时间:2023-12-04 07:34:14 25 4
gpt4 key购买 nike

我对根据其他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 ]

我想按照 Av1中的对应值对 v2的列进行排序,其中 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根据存储在另一个向量中的值对数组进行排序。是否可以将sortperm与2个向量一起使用(就地)?

最佳答案

我可能会这样:

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!版本。您可以从combinatorics.jl中 permute!!的代码开始,然后对其进行修改以置换列,从而重新使用单个列大小的临时缓冲区。

关于arrays - Julia :按另一个向量中的值对矩阵的列进行排序(就位...)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39243591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com