Domanda

Diciamo che ho un array monodimensionale:

a = [1, 2, 3];

C'è un built-in funzione Matlab che accetta una matrice e un n intero e replicati ciascuno Elemento dei tempi matrice n?

Per esempio chiamando replicate(a, 3) dovrebbe restituire [1,1,1,2,2,2,3,3,3].

Si noti che questa non è affatto la stessa repmat. Posso certamente implementare replicate facendo repmat su ogni elemento e concatenando il risultato, ma mi chiedo se non v'è una costruito in funzione che è più efficiente.

È stato utile?

Soluzione

A partire dal R2015a , c'è un built funzione -in e documentato per fare questo, repelem :

  

repelem replicare elementi di un array.
      W = repelem(V,N), con vettore V e scalari N, crea un W vettore in cui ogni elemento di V viene ripetuta volte N.

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

B = repelem(A,N1,N2)

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

UPDATE: Per un confronto delle prestazioni con altri metodi veloci, si prega di consultare il Q & A Ripetere copie di elementi di un array :. decodifica Run-length in MATLAB

Altri suggerimenti

Sono un fan della KRON funzione:

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

b =

    1     1     1     2     2     2     3     3     3

Si può anche guardare a questa domanda relativa (che riguardava elementi replicanti di matrici 2-D) per vedere alcune delle altre soluzioni che comportano matrice indicizzazione. Ecco un tale soluzione (ispirato da di Edric risposta ):

>> 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. Assegnare il (primo) frutto di meshgrid ad un vettore:

    b = NaN(1,numel(a)*n); %// pre-shape result
    b(:) = meshgrid(a,1:n);
    
  2. Crea una matrice che moltiplicato 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 casella degli strumenti di 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));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top