45 votes

Ordre aléatoire des lignes Matlab

Disons que nous avons une matrice de taille 100x3

Comment mélanger les rangées dans MATLAB ?

0 votes

2 votes

Il ne s'agit pas de sélectionner, mais de "désordonner" ou de mélanger les lignes d'une matrice.

1 votes

En fait, vous avez raison. Ce n'est pas tout à fait la même question. Voir ma réponse ci-dessous.

73voto

Jonas Points 54073

Pour mélanger les lignes d'une matrice, vous pouvez utiliser RANDPERM

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

randperm générera une liste de N des valeurs aléatoires et les trier, renvoyant la deuxième sortie de sort comme résultat.

3 votes

Votre solution fonctionne environ 2,5 fois plus vite que la mienne, du moins sur mon ordinateur.

0 votes

Merci Jonas. Cela fonctionne comme sur des roulettes. Si vous voulez plutôt mélanger les colonnes d'une matrice, la solution est : shuffledArray = orderedArray( :,randperm(size(orderedArray,2))))

6voto

KnowledgeBone Points 344

Cela peut être fait en créant un nouvel indice aléatoire pour les lignes de la matrice via la fonction de Matlab randsample fonction.

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

1 votes

Je pense que vous vouliez utiliser 'false' - si l'on procède à un échantillonnage avec remplacement, la matrice résultante contiendra des lignes en double, tandis que d'autres auront disparu. Dans le cas d'un échantillonnage sans remplacement, randsample appelle randperm ce qui ne devrait donc être que légèrement plus lent que d'appeler randperm directement.

3voto

En lisant le réponse de Jonas Je l'ai trouvé un peu difficile à lire, difficile à comprendre. Dans Mathworks, j'ai trouvé une version similaire question où la réponse est plus lisible, plus facile à comprendre. En prenant l'idée de Mathworks, j'ai écrit une fonction :

function ret = shuffleRow(mat)

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

En fait, il fait la même chose que Réponse de Jonas . Mais je pense que c'est un peu plus lisible, plus facile à comprendre.

1voto

Rahul Points 11

Pour les grands ensembles de données, vous pouvez utiliser la fonction personnalisée Shuffle fonction

Il utilise l'algorithme de shuffle de D.E. Knuth (également appelé Fisher-Yates) et l'adorable générateur de nombres aléatoires KISS (G. Marsaglia).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X