Replicación de matriz de elementos en Matlab

Digamos que tengo una matriz unidimensional:

 a = [1, 2, 3]; 

¿Hay una función incorporada de Matlab que toma una matriz y un entero n y replica cada elemento de la matriz n veces?

Por ejemplo, llamar a replicate(a, 3) debería devolver [1,1,1,2,2,2,3,3,3] .

Tenga en cuenta que esto no es en absoluto lo mismo que repmat . Ciertamente puedo implementar replicate haciendo repmat en cada elemento y concatenando el resultado, pero me pregunto si hay una función incorporada que sea más eficiente.

A partir de R2015a , hay una función incorporada y documentada para hacer esto, repelem :

repelem Replicar elementos de una matriz.
W = repelem(V,N) , con el vector V y N escalar, crea un vector W donde cada elemento de V se repite N veces.

El segundo argumento también puede ser un vector de la misma longitud que V para especificar el número de repeticiones para cada elemento. Para la replicación 2D:

 B = repelem(A,N1,N2) 

Ya no necesitas kron u otros trucos.

ACTUALIZACIÓN: Para una comparación de rendimiento con otros métodos rápidos, consulte la sección Preguntas y respuestas Repita las copias de los elementos de la matriz: Desencoding de longitud de ejecución en MATLAB .

Soy un fanático de la función KRON :

 >> a = 1:3; >> N = 3; >> b = kron(a,ones(1,N)) b = 1 1 1 2 2 2 3 3 3 

También puede ver esta pregunta relacionada (que trata sobre la replicación de elementos de matrices en 2-D) para ver algunas de las otras soluciones que involucran la indexación matricial. Aquí hay una de esas soluciones (inspirada en la respuesta de Edric ):

 >> b = a(ceil((1:N*numel(a))/N)) b = 1 1 1 2 2 2 3 3 3 
 a = [1 2 3]; N = 3; b = reshape(repmat(a,N,1), 1, []) 
 >> n=3; >> a(floor((0:size(a,2)*n-1)/n)+1) ans = 1 1 1 2 2 2 3 3 3 

Algunas alternativas exóticas Es cierto que es más divertido que útil:

  1. Asigna el (primer) resultado de meshgrid a un vector:

     b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n); 
  2. Construye una matriz que multiplicada por a da el resultado:

     b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).'; 
  3. Use ind2sub para generar los índices:

     [~, ind] = ind2sub([n 1],1:numel(a)*n); b = a(ind); 

Si tiene la caja de herramientas de procesamiento de imágenes, hay otra alternativa:

 N = 3; imresize(a, [1 N*numel(a)],'nearest') 
 % To get b = [1 1 1 2 2 2 3 3 3] N = 3; a = [1 2 3]; temp_a = a(ones(N,1),:); b = reshape(temp_a,1,numel(temp_a)); % To get b = [1 2 3 1 2 3 1 2 3] N = 3; a = [1 2 3]; temp_a = a(ones(N,1),:); b = reshape(temp_a',1,numel(temp_a));