Quick way to sum array elements based on flag in another array?

4 vues (au cours des 30 derniers jours)
Ted
Ted le 14 Juil 2015
Commenté : Ted le 15 Juil 2015
Say I have 2 arrays: one with "clean" data, and one that tells me which data gets lost, as indicated by zeros. If an element is lost, it should be added to the next observed element. Anybody got a quick one-or-two-liner to come up with the summed array?
Example:
clean = [1 2 3 4 5 6]
lost = [1 0 3 0 0 6]
desired = [1 5 15]
  1 commentaire
Sean de Wolski
Sean de Wolski le 14 Juil 2015
Fun question, well asked with example inputs and expected outputs +1

Connectez-vous pour commenter.

Réponse acceptée

Stephen23
Stephen23 le 14 Juil 2015
Modifié(e) : Stephen23 le 14 Juil 2015
Try this:
tmp = (1:numel(lost))-[0,cumsum(lost(1:end-1)==0)];
desired = accumarray(tmp.',clean).'
Tested:
>> clean = [1 2 3 4 5 6];
>> lost = [1 0 3 0 0 6];
>> tmp = (1:numel(lost))-[0,cumsum(lost(1:end-1)==0)];
>> desired = accumarray(tmp.',clean).'
desired =
1 5 15
>> clean = [40 10 50 30 40 10 50 30 40 10 50 30];
>> lost = [40 0 50 30 0 10 0 0 40 10 50 30];
>> tmp = (1:numel(lost))-[0,cumsum(lost(1:end-1)==0)];
>> desired = accumarray(tmp.',clean).'
desired =
40 60 30 50 120 10 50 30

Plus de réponses (2)

Andrei Bobrov
Andrei Bobrov le 14 Juil 2015
Modifié(e) : Andrei Bobrov le 14 Juil 2015
desired = flip(accumarray(cumsum(lost(end:-1:1)~=0)',clean(end:-1:1)),1)';
or
desired = accumarray(cumsum(xor([0,diff(lost > 0)],lost))',clean)';
  2 commentaires
Ted
Ted le 14 Juil 2015
Thanks for the help. Try:
clean = [40 10 50 30 40 10 50 30 40 10 50 30];
lost = [40 0 50 30 0 10 0 0 40 10 50 30];
It should give:
desired = [40 60 30 50 120 10 50 30];
Your solution does not.
Andrei Bobrov
Andrei Bobrov le 14 Juil 2015
corrected

Connectez-vous pour commenter.


Sean de Wolski
Sean de Wolski le 14 Juil 2015
accumarray(interp1(find(lost),1:nnz(lost),1:numel(lost),'next')',clean)
  4 commentaires
Andrei Bobrov
Andrei Bobrov le 14 Juil 2015
+1
Ted
Ted le 15 Juil 2015
Sorry Sean, I must have fat-fingered the test!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by