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

Tim*_*Tim 5 matlab

有没有一种有效的方法可以在Matlab中找到长度为n的向量中的第m个最小数?我必须使用sort()函数吗?感谢致敬!

Dee*_*epu 7

您无需对数字列表进行排序即可找到第m 最小数字.第m 最小的数字可以在线性时间内找到.即如果n你的数组中有元素,你可以O(n)通过使用选择算法和中值算法的中位数及时得到解决方案.

链接是维基百科的文章,

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


bla*_*bla 3

编辑 2:正如 Eitan 指出的那样,答案的第一部分并没有解决找到最小第 m 个值的问题,而是考虑最小值之后的第 m 个元素。剩下的答案仍然是……为 Eitan 的敏锐度+1。 虽然sort一开始可能非常有效,但您可以尝试看看 a 是否find会更好。例如:

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

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

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

我还想回顾一下 @woodchips 在这个 SO 讨论中已经说过的话,这与你的问题有些相关:

加速基本内置算法(例如排序)的最佳方法是获得更快的硬件。它也会加快其他一切的速度。MATLAB 已经在内部使用优化的代码,以高效的方式做到了这一点。话虽如此,也许 GPU 插件也可以改善这一点......

编辑: 对于它的价值,添加到 Muster 的评论中,有一个名为nth_element的 FEX 文件,它是 C++ 的 MEX 包装,它将及时获得O(n)您需要的解决方案。(类似于@DDD指出的)