2011-03-26 108 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。但我认为它更具可读性,更易于理解。