Replicazione di array element-wise in Matlab

Diciamo che ho un array unidimensionale:

 a = [1, 2, 3]; 

Esiste una funzione Matlab incorporata che accetta un array e un intero n e replica ogni elemento della matrice n volte?

Ad esempio chiamare la replicate(a, 3) dovrebbe restituire [1,1,1,2,2,2,3,3,3] .

Si noti che questo non è affatto lo stesso di repmat . Posso certamente implementare la replicate eseguendo repmat su ciascun elemento e concatenando il risultato, ma mi chiedo se esiste una funzione incorporata che è più efficiente.

A partire da R2015a , esiste una funzione incorporata e documentata per farlo, repelem :

repelem Replica elementi di un array.
W = repelem(V,N) , con vettore V e scalare N , crea un vettore W cui ogni elemento di V viene ripetuto N volte.

Il secondo argomento può anche essere un vettore della stessa lunghezza di V per specificare il numero di repliche per ciascun elemento. Per la replica 2D:

 B = repelem(A,N1,N2) 

Non c’è più bisogno di kron o altri trucchi!

AGGIORNAMENTO: per un confronto delle prestazioni con altri metodi veloci, consultare le domande e risposte Ripetere le copie degli elementi dell’array: decrittazione run-length in MATLAB .

Sono un fan della funzione KRON :

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

Puoi anche guardare questa domanda correlata (che trattava di replicare elementi di matrici 2-D) per vedere alcune delle altre soluzioni che coinvolgono l’indicizzazione della matrice. Ecco una soluzione del genere (ispirata alla risposta di 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 

Alcune alternative esotiche. Certo più divertente che utile:

  1. Assegna il (primo) risultato di meshgrid a un vettore:

     b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n); 
  2. Costruisci una matrice che moltiplicata per a dà il risultato:

     b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).'; 
  3. Usa ind2sub per generare gli indici:

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

Se hai la toolbox per l’elaborazione delle immagini, c’è un’altra 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));