Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reordering a vector in Matlab?

Tags:

arrays

matlab

I have a vector in Matlab B of dimension nx1 that contains the integers from 1 to n in a certain order, e.g. n=6 B=(2;4;5;1;6;3).

I have a vector A of dimension mx1 with m>1 that contains the same integers in ascending order each one repeated an arbitrary number of times, e.g. m=13 A=(1;1;1;2;3;3;3;4;5;5;5;5;6).

I want to get C of dimension mx1 in which the integers in A are reordered following the order in B. In the example, C=(2;4;5;5;5;5;1;1;1;6;3;3;3)

like image 554
TEX Avatar asked Dec 25 '22 20:12

TEX


2 Answers

One approach with ismember and sort -

[~,idx] = ismember(A,B)
[~,sorted_idx] = sort(idx)
C = B(idx(sorted_idx))

If you are into one-liners, then another with bsxfun -

C = B(nonzeros(bsxfun(@times,bsxfun(@eq,A,B.'),1:numel(B))))
like image 94
Divakar Avatar answered Dec 29 '22 01:12

Divakar


This requires just one sort and indexing:

ind = 1:numel(B);
ind(B) = ind;
C = B(sort(ind(A)));
like image 40
Luis Mendo Avatar answered Dec 29 '22 00:12

Luis Mendo