2013-05-14 193 views
1

我有一個60x6矩陣X其中列1是索引,列2到6是該特定索引的數據。我想爲數據列中的每個值分配排名,使得列2至列5按降序排列(最高值排名1,排名最低的排名爲60),列6按降序排列(最低排名1,排名最高的60),但是要保證行順序根據索引(第1列)。排名關係按照值的升序排列等於他們職位平均數的排名。MATLAB按照升序/降序排列矩陣中的值

我已經通過了一些建議(hereherehere)看了一下,盡我自己的版本:

[~,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 

回答

0

我發現一個有些笨拙,但可行的解決我的問題。

它涉及分別提取,排序和分配列的每列數據,然後重新組合在另一個表中的排名。

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行代碼,所以任何更優雅的替代品將會被很好地接收!