2017-04-19 1 views
0

Je veux répéter les éléments d'un vecteur, mais en considérant des blocs d'éléments (sans utiliser de boucles). Par exemple, si l'on considère un bloc de taille 2, j'ai un vecteur comme celui-ci a = [1:6] et je veux que la sortie ressemble à ceci: out = [1 2 1 2 3 4 3 4 5 6 5 6].Matlab: dupliquer des blocs d'éléments dans un vecteur

+0

Pour un bloc d'une taille 3 ce qui est le résultat attendu? – rahnema1

+0

'out = [1 2 3 1 2 3 4 5 6 4 5 6]'. – f380cedric

+0

Et pour un bloc de taille 5? – rahnema1

Répondre

2

Vous pouvez reshape votre entrée, puis le répéter au besoin à l'aide repmat

blksize = 2; 

tmp = repmat(reshape(a, blksize, 1, []), 1, blksize, 1); 

output = tmp(:).'; 

Explication

D'abord, nous voulons remodeler votre matrice dans une matrice blksize x 1 x (numel(a)/blksize).

A = reshape(a, blksize, 1, []); 

Alors nous voulons répéter Ablksize fois le long de la seconde dimension pour créer le nombre nécessaire de répétitions.

B = repmat(A, 1, blksize, 1); 

Nous aplatirez la chose dans un tableau et grâce à la commande de colonne principale, nous obtenons la sortie désirée

output = B(:).' 

en option One-Liner

Si vous voulez vraiment une ligne que vous pouvez utiliser à nouveau reshape plutôt que (:).'

output = reshape(repmat(reshape(a, blksize, 1, []), 1, blksize, 1), 1, []); 

Alternative

Vous pouvez également utiliser repelem de Matlab pour accomplir la répétition

result = reshape(repelem(reshape(a, blksize, 1, []), 1, blksize, 1), 1, [])