Replicação de Matriz Elementar no Matlab

Digamos que eu tenha uma matriz unidimensional:

 a = [1, 2, 3]; 

Existe uma function Matlab incorporada que recebe uma matriz e um inteiro n e replica cada elemento da matriz n vezes?

Por exemplo, a replicate(a, 3) chamada replicate(a, 3) deve retornar [1,1,1,2,2,2,3,3,3] .

Note que isto não é de todo o mesmo que repmat . Eu certamente posso implementar a replicate fazendo repmat em cada elemento e concatenando o resultado, mas estou querendo saber se existe uma function repmat que é mais eficiente.

A partir do R2015a , existe uma function repelem e documentada para fazer isso, repelem :

repelem Replicar elementos de uma matriz.
W = repelem(V,N) , com vetor V e N escalar, cria um vetor W onde cada elemento de V é repetido N vezes.

O segundo argumento também pode ser um vetor do mesmo tamanho que V para especificar o número de replicações para cada elemento. Para replicação 2D:

 B = repelem(A,N1,N2) 

Não há necessidade de kron ou outros truques mais!

ATUALIZAÇÃO: Para obter uma comparação de desempenho com outros methods rápidos, consulte as perguntas e respostas. Repita as cópias dos elementos da matriz: decodificação da duração da execução no MATLAB .

Sou fã da function KRON :

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

Você também pode examinar essa questão relacionada (que tratou de elementos de replicação de matrizes 2D) para ver algumas das outras soluções que envolvem a indexação matricial. Aqui está uma dessas soluções (inspirada na resposta 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 

Algumas alternativas exóticas. É mais engraçado do que útil:

  1. Atribua o (primeiro) resultado do meshgrid de meshgrid a um vetor:

     b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n); 
  2. Construa uma matriz que multiplicada por a dá o resultado:

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

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

Se você tiver a checkbox de ferramentas de processamento de imagens, existe outra 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));