Filter löschen
Filter löschen

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

4 Ansichten (letzte 30 Tage)
Ted
Ted am 14 Jul. 2015
Kommentiert: Ted am 15 Jul. 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]

Akzeptierte Antwort

Stephen23
Stephen23 am 14 Jul. 2015
Bearbeitet: Stephen23 am 14 Jul. 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

Weitere Antworten (2)

Andrei Bobrov
Andrei Bobrov am 14 Jul. 2015
Bearbeitet: Andrei Bobrov am 14 Jul. 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 Kommentare
Ted
Ted am 14 Jul. 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.

Melden Sie sich an, um zu kommentieren.


Sean de Wolski
Sean de Wolski am 14 Jul. 2015
accumarray(interp1(find(lost),1:nnz(lost),1:numel(lost),'next')',clean)
  4 Kommentare
Ted
Ted am 15 Jul. 2015
Sorry Sean, I must have fat-fingered the test!

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by