Sort one set of data to correspond to another.
    2 views (last 30 days)
  
       Show older comments
    
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]
0 Comments
Accepted Answer
  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
      
      
 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.
More Answers (2)
See Also
Categories
				Find more on Shifting and Sorting Matrices in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

