Question

Disons que j'ai un tableau à une dimension:

a = [1, 2, 3];

Y at-il une fonction Matlab intégré qui prend une matrice et un n entier et chaque réplique élément des n fois de la matrice?

Par exemple appeler replicate(a, 3) devrait revenir [1,1,1,2,2,2,3,3,3].

Notez que ce n'est pas du tout le même que repmat. Je peux certainement mettre en œuvre replicate en faisant repmat sur chaque élément et concaténer le résultat, mais je me demande s'il y a une fonction intégrée qui est plus efficace.

Était-ce utile?

La solution

Au R2015a , il y a un construite à fonction -in et documenté pour ce faire, repelem :

  

repelem Répliquer éléments d'un tableau.
      W = repelem(V,N), avec le vecteur V et N scalaire, crée un vecteur W où chaque élément de V est répété de fois N.

Le second argument peut également être un vecteur de la même longueur que V pour spécifier le nombre de répétitions de chaque élément. Pour la réplication 2D:

B = repelem(A,N1,N2)

Pas besoin de kron ou d'autres trucs plus!

Mise à jour: Pour une comparaison des performances avec d'autres méthodes rapides, s'il vous plaît voir le Q & A copies Répéter des éléments du tableau :. décodage d'exécution de longueur dans Matlab

Autres conseils

Je suis un fan de la KRON fonction:

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

b =

    1     1     1     2     2     2     3     3     3

Vous pouvez également consulter cette question liée (qui traitait des éléments répliquant des matrices 2-D) pour voir quelques-unes des autres solutions impliquant l'indexation de la matrice. Voici une telle solution (inspirée par réponse 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

Quelques alternatives exotiques. Il est vrai que plus drôle qu'utile:

  1. Affecter la (première) résultat de meshgrid à un vecteur:

    b = NaN(1,numel(a)*n); %// pre-shape result
    b(:) = meshgrid(a,1:n);
    
  2. Construire une matrice qui multipliée par a donne le résultat:

    b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
    
  3. Utilisez ind2sub pour générer les indices:

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

Si vous avez la boîte à outils de traitement d'image, il y a une autre alternative:

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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top