假设我有一个A
商品ID的向量:
A=[50936
332680
107430
167940
185820
99732
198490
201250
27626
69375];
我有一个矩阵,B
其行包含vector中每个项目的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];
因此,矩阵的B
第1A
列B
表示向量的第1行中的项目数据,矩阵的第2列表示向量的第2行中的项目数据A
,依此类推。但是,我希望矩阵B
按存储在vector中的项目的不同顺序包含信息A2
:
A2=[185820
198490
69375
167940
99732
332680
27626
107430
50936
201250];
如何对它们进行排序,以使矩阵的B
第1A2
列B
包含vector的第1行中的项目数据,矩阵的第2列包含vector的第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,:);
但是我想知道一种更清洁,更优雅,更省时的方法。
可能的解决方案
您可以使用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
这是八度的结果:
-----ISMEMBER:-------
Elapsed time is 0.00157714 seconds.
-----SORT:-----------
Elapsed time is 4.41074e-05 seconds.
结论:排序方法更有效!
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句