在Matlab中找到第m个最小的数字?

时间:2013-05-03 07:27:11

标签: matlab

在Matlab中找到长度为n的向量中的第m个最小数是否有效?我必须使用sort()函数吗?谢谢和问候!

3 个答案:

答案 0 :(得分:7)

您无需对数字列表进行排序即可找到 m th 最小数字。 m th 最小数字可以在线性时间内找到。即,如果数组中有n个元素,则可以使用选择算法和中值算法的中位数在O(n)时间内获得解。

该链接指向维基百科文章,

http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_Median_of_Medians_algorithm

答案 1 :(得分:3)

编辑2 :正如Eitan指出的那样,答案的第一部分没有解决找到最小的第m个值但是关于最小值之后的第m个元素的问题。其余的答案仍然是......对于Eitan的锐度来说是+1。 <击> 虽然sort可能非常有效,但您可以尝试查看find是否会更好。例如:

id=find(X>min(X),m,'first');
id(end) % is the index of the smallest m-th element in X

函数find添加了一些功能,可让您找到符合某些条件的“第一个”或“最后一个”元素。例如,如果要查找数组n中的第一个X元素小于值y,请使用find(X<y,n,'first')

一旦遇到符合条件的第一个元素,此操作就会停止,如果数组很大且找到的值恰好远离结尾,则可以节省大量时间。

我还想回顾@woodchips在this SO discussion中已经说过的与你的问题有些相关的内容:

加速基本内置算法(如sort)的最佳方法是获得更快的硬件。它也将加速其他一切。 MATLAB已经在内部使用优化代码以高效的方式完成了这项工作。说到这一点,也许GPU附加组件也可以改善这一点......

修改 对于它的价值,添加到Muster的评论中,有一个名为nth_element的FEX文件,它是C ++的MEX包装,它将在O(n)时间内为您提供所需的解决方案。 (类似于@DDD指出的)

答案 2 :(得分:1)

作为替代解决方案,您可以遵循以下方式:

A = randi(100,4000,1);
A = sort(A,'ascend');
m = 5; % the 5 smallest numbers in array A
B = A(1:5);

我希望这会有所帮助。