Random order of rows Matlab

48,838

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).

Share:
48,838

Related videos on Youtube

edgarmtze
Author by

edgarmtze

Updated on February 06, 2020

Comments

  • edgarmtze
    edgarmtze about 4 years

    Say we have a matrix of size 100x3

    How would you shuffle the rows in MATLAB?

    • Jonas
      Jonas about 13 years
    • edgarmtze
      edgarmtze about 13 years
      It is not about selecting, it is about "desorder" or shuffle the rows of a matrix
    • Jonas
      Jonas about 13 years
      Actually, you're right. It's not quite the same question. See my answer below.
  • KnowledgeBone
    KnowledgeBone about 13 years
    Your solution runs about 2.5x faster than mine does, at least on my computer.
  • Jonas
    Jonas about 13 years
    I 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 calls randperm, which should thus only be marginally slower than calling randperm directly.
  • Rainymood
    Rainymood over 5 years
    Thanks 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)))