由于没有特别的原因,我想知道是否可以在一个数组或矩阵中选择n个最大值,所有这些都在oneliner中。
说我有阵列:
A=randn(1,100);
我想要最大的,例如20个值,最好从高到低排序。到目前为止,我有2个班轮:
A_ordered = sort(A,'descend');
A_big20 = A_ordered(1:20);
有人知道这行是否可行?如果是这样,我会很感激线索,想法或答案!
答案 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) ) ) ) )