矩阵中观察的排序(排序值)

时间:2018-03-26 08:59:15

标签: matlab

我试图在矩阵中获得观察的等级,同时考虑到可以重复自己的NaN和值。

E.g。如果我们有

A = [0.1 0.15 0.3; 0.5 0.15 0.1; NaN 0.2 0.4];

A =

    0.1000    0.1500    0.3000
    0.5000    0.1500    0.1000
    NaN       0.2000    0.4000

然后我想获得以下输出:

B =

     1     2     4
     6     2     1
     NaN     3     5

因此0.1是最低值(rank = 1),而0.5是最高值(rank = 6)。

理想情况下,没有循环的有效解决方案。

1 个答案:

答案 0 :(得分:3)

您可以使用unique。默认情况下,这会对数据进行排序,您可以获取已排序的唯一值的索引。这会复制你的领带行为,因为相同的值将具有相同的索引。您可以使用逻辑索引省略NaN值。

r = A;                                   % or NaN(size(A))
nanIdx = isnan(A);                       % Get indices of NaNs in A to ignore
[~, ~, r(~nanIdx)] = unique(A(~nanIdx))  % Assign non-NaN values to their 'unique' index

>> r = 
    [   1   2   4
        6   2   1
      NaN   3   5  ]

如果您拥有统计工具箱,则可以使用tiedrank功能获得类似的结果。

r = reshape(tiedrank(A(:)), size(A)) % Have to use reshape or rank will be per-column

>> r = 
    [ 1.5,  3.5,  6.0
      8.0,  3.5,  1.5
      NaN,  5.0,  7.0 ]

这不是您想要的结果(根据您的示例)。您可以看到tiedrank实际上使用的是比您更常规的排名系统,其中平局为每个结果提供平均排名。例如,并列第1和第2,每个等级为1.5,下一等级为3.