嗨,我需要对向量进行排序并为相应的排序顺序分配排名。我正在使用排序功能[sortedValue_X , X_Ranked] = sort(X,'descend');
,但问题是它为相同的值(零)分配不同的等级。即x = [ 13 15 5 5 0 0 0 1 0 3]
,我希望零获得相同的最后排名,即 6,而五需要共享第三排名等。有什么建议吗?
问问题
9274 次
2 回答
10
语法[sortedValues, sortedIndexes] = sort(x, 'descend')
不会像您描述的那样返回排名。它返回排序值的索引。如果您想使用一个数组的排序顺序来重新排列另一个数组,这非常有用。
正如@user1860611 所建议的那样,unique
似乎可以做你想做的事,使用如下第三个输出:
x = [ 13 15 5 5 0 0 0 1 0 3];
[~, ~, forwardRank] = unique(x);
%Returns
%forwardRank =
% 5 6 4 4 1 1 1 2 1 3
要获得您想要的顺序(降序),您需要颠倒顺序,如下所示:
reverseRank = max(forwardRank) - forwardRank + 1
%Returns
%reverseRank =
% 2 1 3 3 6 6 6 5 6 4
你可能在这一点上完成了。但是您可能希望将它们按升序排列。这是向量的重新排序,reverseRank
使其与原始向量保持同步x
,这正是第二个参数sort
旨在帮助解决的问题。所以我们可以这样做:
[xSorted, ixsSort] = sort(x, 'descend'); %Perform a sort on x
reverseRankSorted = reverseRank(ixsSort); %Apply that sort to reverseRank
生成:
xSorted = 15 13 5 5 3 1 0 0 0 0
reverseRankSorted = 1 2 3 3 4 5 6 6 6 6
于 2013-01-22T00:51:34.240 回答
5
tierank.m 可能是您正在寻找的东西。
>> x = round(rand(1,5)*10)
x =
8 7 3 10 0
>> tiedrank(x)
ans =
4 3 2 5 1
于 2014-01-30T09:40:02.483 回答