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