Random order of rows Matlab
Solution 1
To shuffle the rows of a matrix, you can use RANDPERM
shuffledArray = orderedArray(randperm(size(orderedArray,1)),:);
randperm
will generate a list of N
random values and sort them, returning the second output of sort
as result.
Solution 2
This can be done by creating a new random index for the matrix rows via Matlab's randsample function.
matrix=matrix(randsample(1:length(matrix),length(matrix)),:);
Solution 3
While reading the answer of Jonas I found it little bit tough to read, tough to understand. In Mathworks I found a similar question where the answer is more readable, easier to understand. Taking idea from Mathworks I have written a function:
function ret = shuffleRow(mat)
[r c] = size(mat);
shuffledRow = randperm(r);
ret = mat(shuffledRow, :);
Actually it does the same thing as Jonas' answer. But I think it is little bit more readable, easier to understand.
Solution 4
For large datasets, you can use the custom Shuffle function
It uses D.E. Knuth's shuffle algorithm (also called Fisher-Yates) and the cute KISS random number generator (G. Marsaglia).
Related videos on Youtube
edgarmtze
Updated on February 06, 2020Comments
-
edgarmtze about 4 years
Say we have a matrix of size 100x3
How would you shuffle the rows in MATLAB?
-
Jonas about 13 yearspossible duplicate of How do I randomly select k points from N points in MATLAB?
-
edgarmtze about 13 yearsIt is not about selecting, it is about "desorder" or shuffle the rows of a matrix
-
Jonas about 13 yearsActually, you're right. It's not quite the same question. See my answer below.
-
-
KnowledgeBone about 13 yearsYour solution runs about 2.5x faster than mine does, at least on my computer.
-
Jonas about 13 yearsI think you meant to use
'false'
- if sampling with replacement, the resulting matrix will contain duplicate rows, while others will have disappeared. In the case sampling without replacement,randsample
callsrandperm
, which should thus only be marginally slower than callingrandperm
directly. -
Rainymood over 5 yearsThanks Jonas. Works like a charm. If you instead want to shuffle the columns of a matrix the solution is: shuffledArray = orderedArray(:,randperm(size(orderedArray,2)))