replica serie di elementi-wise in Matlab
-
21-09-2019 - |
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.
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 vettoreV
e scalariN
, crea unW
vettore in cui ogni elemento diV
viene ripetuta volteN
.
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:
-
Assegnare il (primo) frutto di
meshgrid
ad un vettore:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
-
Crea una matrice che moltiplicato per
a
dà il risultato:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
-
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));