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

标签 matlab sorting matrix

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

A=[50936
   332680
   107430
   167940
   185820
   99732
   198490
   201250
   27626
   69375];

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

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];

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

A2=[185820
    198490
    69375
    167940
    99732
    332680
    27626
    107430
    50936
    201250];

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

我的极其粗略的解决方案如下:

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,:);

但我想知道一种更干净、更优雅、更省时的方法来做到这一点。

最佳答案

可能的解决方案

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

[~ ,idx] = ismember(A2,A);
B2 = B(:,idx);

更新:我测试了我的解决方案和 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

这是 Octave 的结果:

-----ISMEMBER:-------
Elapsed time is 0.00157714 seconds.
-----SORT:-----------
Elapsed time is 4.41074e-05 seconds.

结论:排序方法效率更高!

关于matlab - 如何在 MATLAB 中按照其他向量的顺序对矩阵的列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41023913/

相关文章:

Python:使用 lambda 以 str 格式对日期时间进行排序

java - 求 3x3 矩阵的辅因子和行列式

java - JAMA:Matrix.times() 与 Matrix.arrayTimes()

matlab - 我怎样才能在 matlab 中做一个 *= 运算符

python - 尽管一切似乎都正常,神经网络却给出了错误的预测

c++ - 加速 Matlab 到 C++ 的转换

c++ - 为 matlab R2011b 设置 c++ 编译器

php - 使用 while 从查询中排序信息?

python:为交叉点排序两个多边形列表

c - 如何使用指针在 C 中打印矩阵?