如何在MATLAB中按照其他向量的顺序对矩阵的列进行排序?

Kri*_*673 2 sorting matlab matrix

假设我有一个A项目ID 向量:

A=[50936
   332680
   107430
   167940
   185820
   99732
   198490
   201250
   27626
   69375];
Run Code Online (Sandbox Code Playgroud)

我有一个矩阵,B其行包含向量中每个项目的8个参数的值A:

B=[0    0   0   0   0   0   0   0   0   0
   0    0   0   0   0   0   0   0   0   0
   1    0   1   0   0   1   0   1   1   1
   1    0   1   0   0   1   0   1   1   1
   0    0   1   0   0   0   0   1   0   1
   0    0   0   0   0   0   0   1   0   0
   0    0   0   0   0   0   0   0   0   0
   0    0   0   0   0   0   0   0   0   1];
Run Code Online (Sandbox Code Playgroud)

因此,矩阵B中的第1 AB表示向量的第1行中的项的数据,矩阵中的第2 列表示向量的第2行中的项的数据A,依此类推.但是,我希望矩阵B以包含在vector中的项目的不同顺序包含信息A2:

A2=[185820
    198490
    69375
    167940
    99732
    332680
    27626
    107430
    50936
    201250];
Run Code Online (Sandbox Code Playgroud)

如何对它们进行排序,以便矩阵的B第1 A2B包含向量的第1 行中的项的数据,矩阵的第2 列包含向量的第2行中的项的数据A2,依此类推?

我这样做非常粗糙的解决方案如下:

A=A'; A2=A2';

for i=1:size(A,2)
    A(2:size(B,1)+1,i)=B(:,i);
end

A2(2:size(B,1)+1,:)=zeros(size(B,1),size(B,2));

for i=size(A2,2)
    for j=size(A,2)
        if A2(1,i)==A(1,j)
            A2(2:end,i)=A(2:end,j);
        end
    end
end

B2 = A2(2:end,:);
Run Code Online (Sandbox Code Playgroud)

但我想知道一种更干净,更优雅,更省时的方法.

rah*_*ma1 6

可能的解决方案

您可以使用ismember函数的第二个输出.

[~ ,idx] = ismember(A2,A);
B2 = B(:,idx);
Run Code Online (Sandbox Code Playgroud)

更新:我测试了我的解决方案和hbaderts提出的另一个解决方案

disp('-----ISMEMBER:-------')
tic
    [~,idx]=ismember(A2,A);
toc
disp('-----SORT:-----------')
tic
    [~,idx1] = sort(A);
    [~,idx2] = sort(A2);
    map = zeros(1,size(idx2));
    map(idx2) = idx1;
toc
Run Code Online (Sandbox Code Playgroud)

以下是Octave的结果:

-----ISMEMBER:-------
Elapsed time is 0.00157714 seconds.
-----SORT:-----------
Elapsed time is 4.41074e-05 seconds.
Run Code Online (Sandbox Code Playgroud)

结论:排序方法更有效!