在Matlab中找到长度为n的向量中的第m个最小数是否有效?我必须使用sort()函数吗?谢谢和问候!
答案 0 :(得分:7)
您无需对数字列表进行排序即可找到 m th 最小数字。 m th 最小数字可以在线性时间内找到。即,如果数组中有n
个元素,则可以使用选择算法和中值算法的中位数在O(n)
时间内获得解。
该链接指向维基百科文章,
答案 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);
我希望这会有所帮助。