如何加快Matlab中的“排序”功能?

时间:2011-08-11 01:53:02

标签: performance function sorting matlab

我使用的是Matlab的内置排序功能:

[temp, Idx] = sort(M,2);

我想得到M的每一行的排序索引,这是一个大小为>的矩阵。 50K。

我努力搜索但没有找到任何东西..如果您有任何意见,我们将不胜感激!

4 个答案:

答案 0 :(得分:9)

为了了解你有多少改进空间,我建议用C语言编写一个测试程序并使用qsort或C ++和用户排序,并仔细计时7000个大小为7000的输入(或者你有任何设置在Matlab中)。

我将给你我的估计:可能Matlab的排序运行(在正确的矢量化代码上,像你的一样)和C ++一样快,你只是看到运行一个需要O(n ^ 2的算法的效果)记录n)。 reported in Matlab's marketing material它的排序函数比C的qsort快,但是它带有一点点盐。

答案 1 :(得分:2)

加快这种速度的最佳方法是获得更快的计算机。它也将加速其他一切。 :)

事实上,你很难将单个调用加速到像某种类似的东西。 MATLAB已经在内部使用优化代码以高效的方式完成了这项工作。 (重读carlosdc的答案。)有时你可以得到提升的工具是用MATLAB本身编写的工具。

那么,你能做什么?如果没有购买新电脑,您可以查看整体代码。这种尺寸的一种类型从来不是一个大问题。但一遍又一遍地做这种事的原因是。仔细考虑代码,关于是否可以改变流程或避免多次重复排序。算法改变通常是FAR更大的改进来源,即使你可以改进那种类型,你也可以得到更好的改进。

答案 2 :(得分:2)

排序基本上是O(n log n)。

只要您的实施效率相当高,就不太可能发生太大变化。

也就是说,正如Andrew Janke的评论所暗示的那样,多线程可以大大改善事情。

GPU编程可以成为大规模加速的一种方式。如果你有R2010b或更高版本,你可以使用accelerated versions内置函数,例如从Mathworks中排序。

否则,在CUDA Thrust library周围写一个包含排序的mex包装。

答案 3 :(得分:1)

你可以用C / C ++编写自己的排序函数作为MEX。 MATLAB文档中有一些示例。

在边缘情况下,有许多sort algorithms比其他更好,例如几乎排序的数据或稳定性(在MATLAB中无关紧要,因为它的所有类型都是值类型)。

您的数据是数字还是字符串?对于字符串,可能有特殊的ASCII排序算法,有时候natural sort是最好的。