MATLAB присваивает ранг значениям в матрице в порядке возрастания/убывания

У меня есть матрица 60x6 X, где столбец 1 — это индекс, а столбцы со 2 по 6 — данные для этого конкретного индекса. Я хотел бы присвоить ранги каждому значению в столбцах данных, чтобы столбцы со 2 по 5 ранжировались в порядке убывания (наибольшее значение оценивается 1, наименьшее значение ранжируется 60), а столбец 6 ранжируется в порядке убывания (самое низкое значение оценивается 1, наивысший рейтинг 60), но так, чтобы порядок строк сохранялся в соответствии с индексом (столбец 1). Ранговым связям присваивается ранг, равный среднему значению их позиций в порядке возрастания значений.

Я просмотрел ряд предложений (здесь, здесь и здесь) и попробовал свою версию:

[~,Z1] = sort(X(:,2),'descend');
[~,Z2] = sort(X(:,3),'descend');
[~,Z3] = sort(X(:,4),'descend');
[~,Z4] = sort(X(:,5),'descend');
[~,Z5] = sort(X(:,6));

но ни один из них не работает так, как я хочу. Таким образом, для

    X =

        1    0.9503    0.5646    0.3785    0.5468   -0.0161     
        2    0.9430    0.5728    0.3320    0.6693   -0.0161
        3    0.5305    0.2719    0.1545    0.3480    0.0042
        4    0.8588    0.5816    0.3429    0.6477   -0.0158
        5    0.9391    0.5984    0.3362    0.6054   -0.0161
        6    0.3780    0.2307    0.0906    0.3387    0.0054

я нуждаюсь

    Ans = 

         1   1   4   1   4   2
         2   2   3   4   1   2
         3   5   5   5   5   5
         4   4   2   2   2   4
         5   3   1   3   3   2
         6   6   6   6   6   6

person 8eastFromThe3ast    schedule 14.05.2013    source источник


Ответы (1)


Я нашел несколько неуклюжее, но работоспособное решение моей проблемы.

Он включает в себя извлечение, сортировку и присвоение рангов каждому столбцу данных отдельно, а затем повторное объединение рангов в другой таблице.

Arank = sortrows(X(:,1:2),-2);       % sort data in descending (or ascending) order
Arank(:,3)=1:60;                     % assign rank
Arank = sortrows(Arank,1);           % re-sort by index
% % same process is applied individually to each column
Allranks = horzcat(Arank(:,[1,3]), Brank(:,3),... 
Crank(:,3), Drank(:,3), Erank(:,3)); % combine all ranks sorted by index

Однако в целом это составляет до 20 строк кода, поэтому любые более элегантные альтернативы будут очень хорошо приняты!

person 8eastFromThe3ast    schedule 15.05.2013