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 A列B表示向量的第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 A2列B包含向量的第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)
但我想知道一种更干净,更优雅,更省时的方法.
可能的解决方案
您可以使用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)
结论:排序方法更有效!