2017-05-08 1 views
2

Disons que j'ai un vecteur qui a l'air si (les chiffres seront toujours> 0) ...éléments du groupe et la somme qui sont les mêmes dans un vecteur

[1, 2, 1, 4, 1, 2, 4, 3] 

je besoin d'une mise en œuvre vectorisé que les sommes les nombres ensemble et utilise le nombre original comme index pour stocker le nombre. Donc, si je le lance, je recevrais ...

% step 1 
[1+1+1, 2+2, 3, 4+4] 

% step 2 
[3, 4, 3, 8] 

Je l'ai déjà mis en oeuvre à l'aide pour les boucles, mais je me sens comme il y a un moyen vectorisée pour y parvenir. Je suis encore jeune dans les fonctions de vectorisation, donc toute aide est appréciée.

Répondre

3

Cela ressemble à un travail pour accumarray:

v = [1, 2, 1, 4, 1, 2, 4, 3]; 
result = accumarray(v(:), v(:)).' 

result = 

    3  4  3  8 
2

D'autres approches:

  • En utilisant histcounts:

    x = [1, 2, 1, 4, 1, 2, 4, 3]; 
    u = unique(x); 
    result = u.*histcounts(x, [u inf]); 
    
  • L'utilisation bsxfun (peut être plus gourmande en mémoire) :

    x = [1, 2, 1, 4, 1, 2, 4, 3]; 
    u = unique(x); 
    result = u .* sum(bsxfun(@eq, x(:), u(:).'), 1); 
    
+0

Si la plage est petit et le grand nombre, puis les histcounts est une approche raisonnable et d'autre part les zéros ne sont pas un drame. – Holmz