8
votes

Réplication de la matrice d'élément-sage selon un compte

Ma question est similaire à ce un , mais je voudrais reproduire chaque élément selon un compte spécifié dans un second tableau de même taille.

Un exemple de ceci, disons que j'avais un tableau v = [3 1 9 4] , je veux utiliser rep = [2 3 1 5] Pour reproduire le premier élément 2 fois, les seconde trois fois, etc. Pour obtenir [3 3 1 1 1 9 4 4 4 4 4 4] < /Code >.

Je suis loin d'une boucle simple pour faire le travail. C'est ce que j'ai commencé avec: xxx

J'ai réussi à améliorer par l'espace de préallocation: xxx

Cependant, je suis toujours senti là doit être un moyen plus intelligent de faire cela ... merci


4 Réponses :


16
votes

Voici une façon dont j'aime accomplir ceci: xxx

Ceci fonctionne en créant d'abord un vecteur d'index de zéros de la même longueur que le nombre final de toutes les valeurs. En effectuant une somme cumulative du vecteur avec le dernier élément retiré et 1 placé au début, je reçois un vecteur d'indices dans index montrant où les groupes de répliqués Les valeurs vont commencer. Ces points sont marqués de ceux. Lorsqu'une somme cumulative est effectuée sur index , je reçois un vecteur d'index final que je peux utiliser pour indexer dans v pour créer le vecteur de valeurs répliquées hétérogènes.


4 commentaires

Pourriez-vous ajouter quelques commentaires de la façon dont cela fonctionne?


@Nathan: déjà en avance sur Ya. =)


Certainement un moyen intelligent d'utiliser cumsum .. merci!


Soyez prudent, cette solution ne fonctionne que si tous les éléments de rep sont positifs. Si vous ne voulez pas répéter certains éléments en définissant certains éléments de rep sur zéros, cela échouera. v = [3 1 9 4] et rep = [2 3 1 0] entraîne dans [3 3 1 1 1 9 4] , donner un élément supplémentaire.



2
votes

Pour ajouter à la liste des solutions possibles, considérez celui-ci:

vv = cellfun(@(a,b)repmat(a,1,b), num2cell(v), num2cell(rep), 'UniformOutput',0);
vv = [vv{:}];


1 commentaires

Vous pouvez réellement utiliser Arrayfun et éviter les appels à Num2Cell, mais ce serait toujours beaucoup plus lent: Stackoverflow.com/questions/1975772/MATLAB-ARRAY-MANIPULATIO N / ... .



0
votes

Qu'est-ce que vous essayez de faire est de Decode de longueur d'exécution . Un utilitaire de haut niveau fiable / vectorisé est le soumission FEX rud () : xxx

le résultat xxx

Notez que cette fonction effectue également l'opération opposée, c'est-à-dire Encodes de longueur Un vecteur ou en d'autres terres renvoie valeurs et le compte correspondant .


0 commentaires

0
votes

accumarray fonction peut être utilisé pour que le code fonctionne si zéros quitte dans rep tableau xxx

Ceci fonctionne comme une solution similaire à la solution de GNOVICE, sauf que les indices sont accumulés à la place en étant attribués à 1. Cela permet de sauter des indices (3 et 6 dans l'exemple ci-dessous) et de retirer les éléments correspondants de la sortie. xxx


0 commentaires