la réplication de l'ensemble élément-sage dans Matlab
-
21-09-2019 - |
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.
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 vecteurV
etN
scalaire, crée un vecteurW
où chaque élément deV
est répété de foisN
.
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:
-
Affecter la (première) résultat de
meshgrid
à un vecteur:b = NaN(1,numel(a)*n); %// pre-shape result b(:) = meshgrid(a,1:n);
-
Construire une matrice qui multipliée par
a
donne le résultat:b = a * fliplr(sortrows(repmat(eye(numel(a)),n,1))).';
-
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));