MATLAB Answers

Summing few sequences in a vector

3 views (last 30 days)
How can I sum few sequences in a vector? For example, if I have the vector:
A = [1 1 0 4 1 1 0 2 1 1 1]
I want to get the vector:
B = [2 6 5]
Which is the sum of sequences separated by zero.
Of curse I wand to do it without any for/while loops.
Thank you.

Accepted Answer

Walter Roberson
Walter Roberson on 20 Dec 2016
t1 = cumsum(A);
B = diff([0,t1(A==0),B(end)]);
  2 Comments
Walter Roberson
Walter Roberson on 20 Dec 2016
t1 = cumsum(A);
B = diff([0,t1(A==0),t1(end)]);

Sign in to comment.

More Answers (2)

KSSV
KSSV on 20 Dec 2016
Edited: KSSV on 20 Dec 2016
A = [1 1 0 4 1 1 0 2 1 1 1] ;
ne0 = find(A~=0); % Nonzero Elements
i0 = unique([ne0(1) ne0(diff([0 ne0])>1)]); % Segment Start Indices
i1 = ne0([find(diff([0 ne0])>1)-1 length(ne0)]); % Segment End Indices
for k1 = 1:length(i0)
section{k1} = A(i0(k1):i1(k1));
end
iwant = cellfun(@sum,section)
  1 Comment
George Tsintsadze
George Tsintsadze on 20 Dec 2016
Sorry but I asked for solutions without any for/while loops...

Sign in to comment.


José-Luis
José-Luis on 20 Dec 2016
Not particularly efficient but fulfilling the eternal quest for one liners:
result = cellfun(@(x) sum(x((x - '0') > 0 & (x - '0') <= 9 ) - '0'), strsplit(num2str(A),'0'))
  2 Comments
José-Luis
José-Luis on 20 Dec 2016
Because
strsplit(num2str(A),'0')
returns a cell array of character arrays and I wanted to perform the comparisons on numbers. It's just a way of transitioning from characters to numbers. Otherwise some unnecessary blank characters would have been included in the computation.
Please accept the answer that best solves your problem.

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!