valor una suma seleccionar posicion matriz matrices for extraer elementos arrays matlab repeating run-length-encoding elementwise-operations

arrays - una - Replicación de matriz de elementos en Matlab



suma de elementos de un vector matlab (7)

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 = [1 2 3]; N = 3; b = reshape(repmat(a,N,1), 1, [])


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


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


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 2D) 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 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: Descodificación de longitud de ejecución en MATLAB .