簡體   English   中英

如何在 Matlab 中加快“排序”function?

[英]How to speed up 'sort' function in Matlab?

我使用的是 Matlab 的內置排序 function:

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

我想要 M 的每一行的排序索引,這是一個大小> 50k 的矩陣。

我努力搜索,但沒有找到任何東西。如果您有任何意見,將不勝感激!

為了了解您有多大的改進空間,我建議在 C 中編寫一個測試程序,並使用 qsort 或 C++ 和用戶排序,並在 7000 個大小為 7000 的輸入(或 Matlab 中的任何設置)上仔細計時.

我將給你我的估計:可能 Matlab 的排序運行(在正確的矢量化代碼上,比如你的)和 C++ 一樣快,你只是看到運行需要 O(n^2 log n) 的算法的效果. 在 Matlab 的營銷材料中報道說,它的排序 function 比 C 的 qsort 快,但對它持保留態度。

加速這種排序的最佳方法是獲得一台速度更快的計算機。 它也會加快其他一切。 :)

事實是,您很少能加快對 sort 之類的單個調用的速度。 MATLAB 已經在以一種有效的方式做到這一點,在內部使用優化的代碼。 (重讀 carlosdc 答案。)有時您可以得到提升的是用 MATLAB 本身編寫的工具。

所以,你可以做什么? 除了購買那台新計算機之外,您還可以查看您的整體代碼。 那種大小的單一種類從來都不是那么大的問題。 但是一遍又一遍地做那種事情的原因是。 仔細考慮代碼,是否可以更改流程或避免多次重復排序。 算法改變通常是比你能得到的微小改進更大的改進來源,即使你可以改進這種方法。

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

只要您有一個相當有效的實現,這不太可能發生太大變化。

也就是說,正如 Andrew Janke 的評論所暗示的,多線程可以顯着改善事情。

GPU 編程可以成為獲得巨大加速的一種方式。 如果您有 R2010b 或更高版本,則可以使用內置函數的加速版本,例如 Mathworks 中的 sort。

否則,圍繞包含排序的CUDA 推力庫編寫一個 mex 包裝器。

您可以在 C/C++ 中編寫自己的排序 function 作為 MEX。 MATLAB 文檔有它的示例。

有許多排序算法在邊緣情況下比其他算法更好,例如幾乎排序的數據或穩定性(這在 MATLAB 中無關緊要,因為它的所有類型都是值類型)。

你的數據是數字還是字符串? 對於字符串,可能有特殊的 ASCII 排序算法,有時自然排序更可取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM