2016-02-07 19 views
2

我有一個160x2 MATLAB兩倍的結構如下總結一下多的排名整體具有不同的權重排名

| Vocab | Math 
------------------------- 
1 | 1 | 1 
2 | 3 | 4 
3 | 4 | 3 
4 | 2 | 2 

在上面的例子中我已經簡化東西,所以它只有4×2,而不是160x2。

每列代表學生評分的兩個班級之一。

在翻譯,人1排名靠前,則人3時,則人4,然後人2.

在數學,人1排名靠前,則人4,然後人3,則第2個人。

我想要實現一個綜合排名系統,它將每個人的結果結合到兩個班級上,並使整個排名成爲第三欄。

我想要編寫靈活的代碼,這樣數學可能會比Vocab更重要。假設它的價值是Vocab的兩倍。

我有一個想法,即權重可以通過點系統完成,其中點數越少意味着更好的結果。

人1是最好在翻譯和數學,並且接收1點爲翻譯的排名,和2點(因爲數學是加權雙)爲數學排名= 3總
人2最差(第四)在兩個翻譯和數學,並接收4個點的翻譯排名+ 8分的數學排名= 12總
人3得到2分翻譯,和6分數學= 8總
人4得到3分爲Vocab,4分爲數學= 7共計

基於這些點的分數,雙應進行修改,以添加一列來代表總體排名:

| Vocab | Math |Overall 
------------------------- 
1 | 1 | 1 | 1 
2 | 3 | 4 | 4 
3 | 4 | 3 | 3 
4 | 2 | 2 | 2 

這怎麼可能有效地實現MATLAB?

我想編寫代碼,允許將來靈活地改變權重,以便(例如)數學的價值是詞彙量的三倍。但是,我永遠不需要添加更多的主題 - 它總是隻是Vocab和Math。

我想要決定是否有人在數學上取得更好的成績。

+0

你搞亂了 – Oleg

+0

簡單列混合操作和'sortrows'將工作的翻譯分數。你有沒有嘗試寫一些代碼? –

回答

2

這是一個經典的任務accumarray

%// persons 
p = [1 2 3 4]; 

%// rank of person in each classes 
%// class 1, class 2, class 3  
c = [ 1  1  4  ; 
     3  3  2  ; 
     4  4  1  ; 
     2  2  3  ]; 

%// weights of classes 
w = [1 2 3]; 

%// score table 
s = bsxfun(@mtimes,ndgrid(1:size(c,1),1:size(c,2)),w) 

%// sum up points per person 
ppp = accumarray(c(:),s(:)) 

%// overall ranking with class 3 as decisive row in case of tie 
[~,o] = sortrows([ppp c(:,3)],[1 2]) 

%// overall rank of persons in order of person id 
[~,r] = sort(o) 

%// output 
out = table(p(:),r, c, ppp, o,'VariableNames',{'person','rankOfPerson','classes', ... 
              'OverallPointsOfPerson','overallRanking'}) 

out = 

    person rankOfPerson  classes  OverallPointsOfPerson overallRanking 
    ______ ____________ ___________ _____________________ ______________ 

    1   2    1 1 4 12      4    
    2   4    3 3 2 18      1    
    3   3    4 4 1 18      3    
    4   1    2 2 3 12      2    
+0

有辦法我可以調整這個代碼,以便它明確處理關係?理想情況下,我想說,如果兩名學生之間的分數相關,我們將排名在數學上表現更好的人。 – user1205197

+1

@ user1205901當然,你需要'sortrows'。 – thewaywewalk

+0

我明白了。由於目前你的代碼中,誰在排名情況下排名更高? – user1205197