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.

 Réponse acceptée

Walter Roberson
Walter Roberson le 20 Déc 2016
t1 = cumsum(A);
B = diff([0,t1(A==0),B(end)]);

2 commentaires

George Tsintsadze
George Tsintsadze le 20 Déc 2016
You can't execute the second line because B is not defined before it and you are using it in this line.
I tried your code and got the warning:
Undefined function or variable 'B'.
Do you have a suggestion how to fix it?
t1 = cumsum(A);
B = diff([0,t1(A==0),t1(end)]);

Connectez-vous pour commenter.

Plus de réponses (2)

KSSV
KSSV le 20 Déc 2016
Modifié(e) : KSSV le 20 Déc 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 commentaire

George Tsintsadze
George Tsintsadze le 20 Déc 2016
Sorry but I asked for solutions without any for/while loops...

Connectez-vous pour commenter.

José-Luis
José-Luis le 20 Déc 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 commentaires

Why did you add the condition
(x - '0') <= 9
in the logical indexing of x?
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.

Connectez-vous pour commenter.

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by