Sort one set of data to correspond to another.

조회 수: 1 (최근 30일)
Ronan
Ronan 2015년 11월 16일
편집: Stephen23 2015년 11월 17일
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]

채택된 답변

Thorsten
Thorsten 2015년 11월 16일
편집: Thorsten 2015년 11월 16일
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
Ronan
Ronan 2015년 11월 16일
Thank you very much.
Guillaume
Guillaume 2015년 11월 16일
편집: Guillaume 2015년 11월 16일
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.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Stephen23
Stephen23 2015년 11월 16일
편집: Stephen23 2015년 11월 17일
>> 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 2015년 11월 16일
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)

카테고리

Help CenterFile Exchange에서 Shifting and Sorting Matrices에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by