Search All of the Math Forum:
Views expressed in these public forums are not endorsed by
Drexel University or The Math Forum.
|
|
|
|
Re: sorting, ranking
Posted:
Aug 21, 2009 12:56 PM
|
|
"Wyatt " <hello@hello.com> wrote in message news:h6mh83$j42$1@fred.mathworks.com... > Hello All, > > I have encountered some weird behavior with matlab when attempting to rank > a list of numbers. > > lets assume that I generate a vector of random numbers.
*snip*
> If I then sort these numbers
*snip*
> and wish to obtain their ranking
*snip*
> I should get back a permutation of the vector temp in terms of the ordered > indices of sorted values from A, instead this code simply returns the I > vector > > the correct execution of the command rank = temp(I) should return > > rank = [7 10 3 1 8 9 4 6 5 2] > > Am I missing something here, or mistaken about how matlab should behave in > this case? Or is there simply a bug?
You have it backwards. You want "rank(I) = temp" instead.
S = 100*rand(1, 10) [value, order] = sort(S) restoreS(order) = value isequal(restoreS, S)
From the reference page:
http://www.mathworks.com/access/helpdesk/help/techdoc/ref/sort.html
"[B,IX] = sort(A,...) also returns an array of indices IX, where size(IX) == size(A). If A is a vector, B = A(IX)." [or exchanging the two sides of the equation, A(IX) = B.]
So the 1st element of B, the sorted array, corresponds to element IX(1) in A -- and that's the assignment you need to make to "undo" the sorting. To generalize, B(k) corresponds to A(IX(k)), or if you vectorize newA(IX) = B undoes the sort and makes A and newA agree.
-- Steve Lord slord@mathworks.com
|
|
|
|