2011-03-26 21 views
41

Digamos que tenemos una matriz de tamaño 100x3Orden aleatorio de filas Matlab

¿Cómo se mezclarían las filas en MATLAB?

+0

posible duplicado de [¿Cómo selecciono aleatoriamente k puntos de N puntos en MATLAB?] (Http://stackoverflow.com/questions/1856141/how-do-i-randomly-select-k-points-from- n-points-in-matlab) – Jonas

+2

No se trata de seleccionar, se trata de "desordenar" o mezclar las filas de una matriz – cMinor

+1

En realidad, tienes razón. No es exactamente la misma pregunta. Ver mi respuesta a continuación. – Jonas

Respuesta

67

a barajar las filas de una matriz, puede utilizar RANDPERM

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

randperm generará una lista de valores aleatorios N y ordenarlos, volviendo la segunda salida del sort como resultado.

+3

Su solución funciona aproximadamente 2.5 veces más rápido que la mía, al menos en mi computadora. – KnowledgeBone

5

Esto se puede hacer mediante la creación de un nuevo índice aleatorio para las filas de la matriz a través de la función de randsample de Matlab.

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

Creo que tenía la intención de utilizar ''false''; si se tomaba muestras con reemplazo, la matriz resultante contendría filas duplicadas, mientras que otras habrían desaparecido. En el caso del muestreo sin reemplazo, 'randsample' llama a' randperm', que solo debería ser un poco más lento que llamar 'randperm' directamente. – Jonas

+0

Reparado, gracias Jonas. – KnowledgeBone

1

Para grandes conjuntos de datos, puede utilizar la función personalizada Shuffle

Utiliza D. E. Algoritmo aleatorio de Knuth (también llamado Fisher-Yates) y el simpático generador de números aleatorios KISS (G. Marsaglia).

1

Mientras leía el answer of Jonas me pareció un poco difícil de leer, difícil de entender. En Mathworks encontré un question similar donde la respuesta es más legible, más fácil de entender. Tomando la idea de Mathworks He escrito una función:

function ret = shuffleRow(mat) 

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

En realidad, hace lo mismo que Jonas' answer. Pero creo que es un poco más legible, más fácil de entender.

Cuestiones relacionadas