我使用的是Matlab的内置排序功能:
[temp, Idx] = sort(M,2);
我想得到M的每一行的排序索引,这是一个大小为>的矩阵。 50K。
我努力搜索但没有找到任何东西..如果您有任何意见,我们将不胜感激!
答案 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是最好的。