Ранжирование значений с повторами. Матлаб

У меня простой вопрос, но я не могу найти ответ...

У меня есть матрица 100 000 строк x 30 столбцов для моделирования, и мне нужно ранжировать 100 тыс. значений каждого столбца. Я ищу что-то похожее на tiedrank, но мне нужно, чтобы повторы учитывались (а не в среднем).

Предположим: data = [-1 2 0 -2 0] мне нужно rank= [2 5 3 1 4]

Любое предложение?

Большое спасибо!

Хуан


person Juan    schedule 29.05.2013    source источник
comment
почему -1 занимает -2 ?   -  person Shai    schedule 29.05.2013
comment
Извиняюсь! Виноват! Должно быть 2... Спасибо!   -  person Juan    schedule 29.05.2013


Ответы (1)


Кажется, вам нужно sort:

data = [-1 2 0 -2 0];
[ignore, idx] = sort( data );
rank( idx ) = 1:numel(idx)

rank =

    2     5     3     1     4

Чтобы ранжировать все столбцы матрицы как один раз, вы можете использовать следующий код

data = [ -1 2 0 -2 0; -1 -1 -2 2 2]' ; %'
[n m] = size( data ); % number of rows and columns
[ignore idx] = sort(data); % sort columns
rank = zeros( size(data) ); % allocate
rank( sub2ind( size(rank), idx, bsxfun(@times, 1:m, ones(n,1) ) ) ) = ...
    repmat( (1:n)', 1, m )

rank =

     2     2
     5     3
     3     1
     1     4
     4     5
person Shai    schedule 29.05.2013
comment
Спасибо, что так быстро ответили! - person Juan; 29.05.2013
comment
@user2431026 user2431026, пожалуйста, посмотрите мое редактирование - расширение решения для ранжирования нескольких столбцов - person Shai; 29.05.2013
comment
Фантастика! Вы были очень полезны! - person Juan; 29.05.2013