Pregunta

Vamos a decir que tengo una matriz unidimensional:

a = [1, 2, 3];

¿Hay una función integrada de Matlab que toma una matriz y un n número entero y se replica cada elemento de las veces matriz n?

Por ejemplo llamando replicate(a, 3) debe 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 aplicar replicate haciendo repmat en cada elemento y concatenando el resultado, pero estoy preguntando si hay una función integrada que es más eficiente.

¿Fue útil?

Solución

A partir de R2015a , hay una de construcción -en función y documentado para hacer esto, repelem :

  

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

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)

No hay necesidad de kron u otros trucos más!

ACTUALIZACIÓN: Para una comparación de rendimiento con otros métodos rápidos, por favor ver el Q & A Repetir las copias de los elementos de la matriz :.-Run de decodificación de longitud en MATLAB

Otros consejos

Soy un fan de la Kron función:

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

b =

    1     1     1     2     2     2     3     3     3

También puede buscar en esta pregunta relacionado (que se ocupa de elementos de replicación de matrices 2-D) para ver algunas de las otras soluciones que implican la indexación matriz. Aquí está una tal solución (inspirado por de Edric respuesta):

>> 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. Sin duda más divertido que útil:

  1. Asignar la (primera) resultado de meshgrid a un vector:

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

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

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

Si usted tiene la caja de herramientas de procesamiento de imágenes, no 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));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top