在一个衬管中选择阵列中的n个最高值

时间:2014-07-08 10:01:05

标签: arrays matlab sorting max

由于没有特别的原因,我想知道是否可以在一个数组或矩阵中选择n个最大值,所有这些都在oneliner中。

说我有阵列:

A=randn(1,100);

我想要最大的,例如20个值,最好从高到低排序。到目前为止,我有2个班轮:

A_ordered = sort(A,'descend');
A_big20 = A_ordered(1:20);

有人知道这行是否可行?如果是这样,我会很感激线索,想法或答案!

3 个答案:

答案 0 :(得分:5)

你说你做了很多,所以最简单和最好的方法是在MATLAB路径上定义一个函数:

function B = topN(A, n)

    if nargin==2 && n==0 
        B = []; return; end

    B = sort(A(:));
    if nargin>1 && n < numel(A)           
        B = B(1:n); end

end

并致电你的&#34;一个&#34;班轮:

top_ten = topN( randn(1,100), 10 );

如果您希望它们按原始顺序排列(而不是排序):

function B = topN_unsorted(A, n)

    if nargin>1 && n==0 
        B = []; return; end

    if nargin==1 || n > numel(A)
        B = A; 
    else
        [B,I] = sort(A(:));
        B = B(I(1:n));
    end

end

答案 1 :(得分:4)

我的意见getfield就是&#34;脏&#34; (虽然在Amro的链接中列出)。 但他是对的,它比简单的两线解决方案慢。如果你为了美丽而坚持,我们就去吧:

A20 = getfield(sort(A,'descend'),{1:20})

答案 2 :(得分:-1)

您可以使用prctile

a = randn(1,100);
n = 10;
topn = sort( a( a > prctile( a, 100 *( 1 - n/numel(a) ) ) ) )