代码之家  ›  专栏  ›  技术社区  ›  Jacob

将一个矩阵与另一个矩阵排序

  •  21
  • Jacob  · 技术社区  · 15 年前

    假设我有一个矩阵 A B (当然大小相同)?

    例如。

    A = rand(3,4);
    [val ind] = sort(A,2);
    B = rand(3,4);
    %// Reorder the elements of B according to the reordering of A
    

    这是我想出的最好的办法

    m = size(A,1);
    B = B(bsxfun(@plus,(ind-1)*m,(1:m)'));
    

    出于好奇,还有别的选择吗?

    Jonas' excellent solution

    n=n

    0.048524       1.4632       1.4791        1.195       1.0662        1.108       1.0082      0.96335      0.93155      0.90532      0.88976
    

    n=2米

    0.63202       1.3029       1.1112       1.0501      0.94703      0.92847      0.90411       0.8849       0.8667      0.92098      0.85569
    

    JITA

    3 回复  |  直到 5 年前
        1
  •  17
  •   Matt    9 年前

    更清楚的方法是使用循环

    A = rand(3,4);
    B = rand(3,4);
    [sortedA,ind] = sort(A,2);
    
    for r = 1:size(A,1)
       B(r,:) = B(r,ind(r,:));
    end
    

    下面是我很快编出来测试的代码:

    siz = 10:100:1010;
    tt = zeros(100,2,length(siz));
    
    for s = siz
        for k = 1:100
    
            A = rand(s,1*s);
            B = rand(s,1*s);
            [sortedA,ind] = sort(A,2);
    
            tic;
            for r = 1:size(A,1)
                B(r,:) = B(r,ind(r,:));
            end,tt(k,1,s==siz) = toc;
    
            tic;
            m = size(A,1);
            B = B(bsxfun(@plus,(ind-1)*m,(1:m).'));
            tt(k,2,s==siz) = toc;
    
        end
    end
    
    m = squeeze(mean(tt,1));
    
    m(1,:)./m(2,:)
    

    ans =
    
        0.7149    2.1508    1.2203    1.4684    1.2339    1.1855    1.0212    1.0201    0.8770       0.8584    0.8405
    

    ans =
    
        0.8431    1.2874    1.3550    1.1311    0.9979    0.9921    0.8263    0.7697    0.6856    0.7004    0.7314
    
        2
  •  6
  •   Jacob    15 年前

    Sort()返回按维度排序的索引。可以显式地为其他维度构造索引,使行保持稳定,然后使用线性索引重新排列整个数组。

    A = rand(3,4);
    B = A; %// Start with same values so we can programmatically check result
    
    [A2 ix2] = sort(A,2);
    %// ix2 is the index along dimension 2, and we want dimension 1 to remain unchanged
    ix1 = repmat([1:size(A,1)]', [1 size(A,2)]); %//'
    %// Convert to linear index equivalent of the reordering of the sort() call
    ix = sub2ind(size(A), ix1, ix2) 
    %// And apply it
    B2 = B(ix)
    ok = isequal(A2, B2) %// confirm reordering
    
        3
  •  0
  •   Perception    13 年前

    你就不能这么做吗?

    [val ind]=sort(A);
    B=B(ind);
    

    它对我有用,除非我对你的问题理解错误。