假设我有一个项目 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/