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] code>, je veux utiliser
rep = [2 3 1 5] code> 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: p> J'ai réussi à améliorer par l'espace de préallocation: p> Cependant, je suis toujours senti là doit être un moyen plus intelligent de faire cela ... merci p> p>
4 Réponses :
Voici une façon dont j'aime accomplir ceci: 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 code> code> avec le dernier élément retiré et 1 placé au début, je reçois un vecteur d'indices dans index code> 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 code>, je reçois un vecteur d'index final que je peux utiliser pour indexer dans
v code> pour créer le vecteur de valeurs répliquées hétérogènes. P > p>
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 code> .. merci!
Soyez prudent, cette solution ne fonctionne que si tous les éléments de rep code> sont positifs. Si vous ne voulez pas répéter certains éléments en définissant certains éléments de
rep code> sur zéros, cela échouera.
v = [3 1 9 4] code> et
rep = [2 3 1 0] code> entraîne dans
[3 3 1 1 1 9 4] code>, donner un élément supplémentaire.
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{:}];
Vous pouvez réellement utiliser Arrayfun et éviter les appels à Num2Cell, mais ce serait toujours beaucoup i> plus lent: Stackoverflow.com/questions/1975772/MATLAB-ARRAY-MANIPULATIO N / ... .
Qu'est-ce que vous essayez de faire est de Decode de longueur d'exécution forte>. Un utilitaire de haut niveau fiable / vectorisé est le soumission FEX le résultat p> Notez que cette fonction effectue également l'opération opposée, c'est-à-dire rud () code>
: valeurs code> et le compte
correspondant code>. p> p> p>
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. p> accumarray code> fonction peut être utilisé pour que le code fonctionne si zéros quitte dans
rep code> tableau
Voir Stackoverflow.com/questions/1975772/MATLAB-ARRAY-MANIPULATIO N A >
@Doresoom: Je pensais avoir répondu à une question comme celle-ci auparavant, mais ne pouvait pas le trouver. Je l'ai finalement traqué en même temps que toi. Le titre et les tags étaient très différents, ce qui a été ce qui a rendu un peu difficile à trouver.
Si quelqu'un vient ici à la recherche d'une solution numpue, vérifiez Docs.cipy .Org / Doc / Numpy / Référence / Généré / Numpy.Repeat.Ht ML