2011-03-26 200 views
41

假設我們有一個大小爲100x3的矩陣行的隨機順序Matlab

如何在MATLAB中拖動行?

+0

可能重複[如何從MATLAB中的N點隨機選擇k點?](http://stackoverflow.com/questions/1856141/how-do-i-randomly-select-k-points-from- n-points-in-matlab) – Jonas 2011-03-26 18:15:22

+2

這不是關於選擇,而是關於「排序」或洗牌矩陣的行 – cMinor 2011-03-26 18:16:11

+1

其實,你是對的。這不是一個完全相同的問題。請參閱下面的答案。 – Jonas 2011-03-26 18:20:38

回答

67

要洗牌矩陣的行,你可以使用RANDPERM

shuffledArray = orderedArray(randperm(size(orderedArray,1)),:); 

randperm會產生N隨機值的列表,並且對它們進行排序,返回sort第二輸出結果。

+3

您的解決方案運行速度比我的快2.5倍,至少在我的電腦上。 – KnowledgeBone 2011-03-26 18:44:09

5

這可以通過Matlab的randsample函數爲矩陣行創建一個新的隨機索引來完成。

matrix=matrix(randsample(1:length(matrix),length(matrix)),:); 
+1

我認爲你的意思是使用'false' - 如果用替換採樣,得到的矩陣將包含重複的行,而其他的則會消失。在沒有替換的情況下抽樣的情況下,'randsample'調用'randperm',因此它應該比直接調用'randperm'稍微慢一些。 – Jonas 2011-03-26 19:19:12

+0

固定,謝謝喬納斯。 – KnowledgeBone 2011-03-26 19:28:03

1

對於大型數據集,您可以使用自定義功能Shuffle

它使用D.E. Knuth的shuffle算法(也稱爲Fisher-Yates)和可愛的KISS隨機數生成器(G. Marsaglia)。

1

在閱讀answer of Jonas時,我發現讀起來有點難,難以理解。在Mathworks中,我找到了類似的question,答案更易讀,更易於理解。以從Mathworks公司我寫了一個函數的想法:

function ret = shuffleRow(mat) 

[r c] = size(mat); 
shuffledRow = randperm(r); 
ret = mat(shuffledRow, :); 

其實它做同樣的事情Jonas' answer。但我認爲它更具可讀性,更易於理解。