Sort one set of data to correspond to another.

2 views (last 30 days)
Say I have an ordered set of data.
a = [100,200,300,400,500];
And say I have another set of data,
b = [300,200,500,400,100]
I m trying to find the index where a is sorted to b. I could use a nested for loop of course but is there a better way to get the index shown below?
c = [5,2,1,4,3]

Accepted Answer

Thorsten
Thorsten on 16 Nov 2015
Edited: Thorsten on 16 Nov 2015
If b is an unsorted version of a, i.e., all elements in b occur once and only once in a, you can use
[~, idx] = sort(b);
In the more general case where b can have some elements of a, and elements can occur more than once, use
for i=1:numel(b), idx(i) = find(ismember(a, b(i))); end
Instead of the for loop, you can also use
idx = arrayfun(@(x) find(ismember(a,x)), b);
  4 Comments
Guillaume
Guillaume on 16 Nov 2015
Edited: Guillaume on 16 Nov 2015
z = arrayfun(@(i) find(ismember(k,i)), x)
Is actually not going to work in the general case, because find may return none or several indices, which would then require a 'UniformOutput', false to arrayfun.
If you assume that find is always going to return one and only one value. Then the second output of ismember is a much more efficient way (no loop) to obtain the same result.

Sign in to comment.

More Answers (2)

Stephen23
Stephen23 on 16 Nov 2015
Edited: Stephen23 on 17 Nov 2015
>> a = [100,200,300,400,500];
>> b = [300,200,500,400,100];
>> [~,Xa] = sort(a);
>> [~,Xb] = sort(b);
>> Xa(Xb)
ans =
5 2 1 4 3

Guillaume
Guillaume on 16 Nov 2015
Following your comment to Thorsten's answer, use the 2nd return value of ismember:
x = [350,420,245,100]
k = [420,100,350,245]
z = ismember(x, k)

Tags

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!