在Matlab中重新排序向量?

时间:2015-04-23 08:05:55

标签: arrays matlab

我在维度B的Matlab nx1中有一个向量,它以特定顺序包含1n的整数,例如n=6 B=(2;4;5;1;6;3)

我有Amx1的向量m>1,其中m=13包含相同的整数,每个整数重复任意次数,例如A=(1;1;1;2;3;3;3;4;5;5;5;5;6) C

我希望得到mx1A B,其中C=(2;4;5;5;5;5;1;1;1;6;3;3;3)中的整数按照Toolbar中的顺序重新排序。在示例中,android:textColorPrimary

4 个答案:

答案 0 :(得分:5)

ismembersort -

的一种方法
[~,idx] = ismember(A,B)
[~,sorted_idx] = sort(idx)
C = B(idx(sorted_idx))

如果你是单行,那么另一行bsxfun -

C = B(nonzeros(bsxfun(@times,bsxfun(@eq,A,B.'),1:numel(B))))

答案 1 :(得分:3)

这只需要一个sort和索引:

ind = 1:numel(B);
ind(B) = ind;
C = B(sort(ind(A)));

答案 2 :(得分:2)

使用repelemaccumarrayunique

的另一种方法
B=[2;4;5;1;6;3];
A=[1;1;1;2;3;3;3;4;5;5;5;5;6];

counts = accumarray(A,A)./unique(A);
repelem(B,counts(B));

%// or as suggested by Divakar 
%// counts = accumarray(A,1);
%// repelem(B,counts(B));

PS:repelem 是在 R2015a 中引入的。如果您使用的是先前版本,请参阅here

答案 3 :(得分:0)

使用hist的另一种解决方案,但有一个循环和扩展内存:(

y = hist(A, max(A))
reps = y(B);
C = [];
for nn = 1:numel(reps)
    C = [C; repmat(B(nn), reps(nn), 1)];
end