How to pick group sum values from an array

4 views (last 30 days)
Poorna Durga Geesupalli on 28 Nov 2022
Commented: William Rose on 2 Dec 2022
How can I do the group sum in an array.
X=[1111100000000010000000100011100011111];
In this X array, I wanna group the values where index 1 occus for 3 or more consecutive cells.
But I need X2=groupsum[5 3 5];
How can I do this.
Thanks,
Stephen23 on 2 Dec 2022
X = '1111100000000010000000100011100011111';
[S,E] = regexp(X,'1{3,}');
N = E-S+1
N = 1×3
5 3 5

William Rose on 28 Nov 2022
Edited: William Rose on 28 Nov 2022
Xs='1111100000000010000000100011100011111';
%% Convert string of digits to array of numbers
X=zeros(1,length(Xs));
for i=1:length(X),X(i)=str2num(Xs(i)); end
%% Process the array, looking for groups of 3 or more consecutive 1's
i=3; % i=current position in vector X
k=1; % k=current position in vector X2
X2=[];
while i<=length(X)
j=i-2;
c=1; %c=1 indicates we should check X1
while c && i<=length(X)
X1=sum(X(j:i));
if X1<(i-j+1)
c=0; %There is at least one "0" in the group, so move one
end
i=i+1;
end
if X1>=3
X2=[X2,X1]; %append X1 to X2
k=k+1;
end
end
%% Display result
fprintf('X2 =');disp(X2)
X2 = 5 3 5
Try it. Good luck.
Stephen23 on 2 Dec 2022
Edited: Stephen23 on 2 Dec 2022
Calling STR2NUM inside a loop in order to convert from char to numeric is very inefficient.
Two simple MATLAB approaches:
X = '1111100000000010000000100011100011111';
X-'0'
ans = 1×37
1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0
sscanf(X,'%1u',[1,Inf])
ans = 1×37
1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0
William Rose on 2 Dec 2022
THank you @Stephen23. Those are nice to know about.

chrisw23 on 28 Nov 2022
Edited: chrisw23 on 28 Nov 2022
X=[1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1];
xStr = string(X).join("");
pat = asManyOfPattern("1",3); % group of at least 3 times "1"
matchVec = xStr.extract(pat);
count = matchVec.join.strlength;
...a step by step example using string functions for this special case

Vilém Frynta on 28 Nov 2022
I tried this: (converting into text, deleting zeros, then finding strings of ones and checking their length)
but I have to go. I might come back later to finish this, but you get the idea. Hope I helped.
x = [1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1];
xTxt = num2str(x)
xTxt = '1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1'
a = strsplit(xTxt,"0")
a = 1×23 cell array
{'1 1 1 1 1 '} {' '} {' '} {' '} {' '} {' '} {' '} {' '} {' '} {' 1 '} {' '} {' '} {' '} {' '} {' '} {' '} {' 1 '} {' '} {' '} {' 1 1 1 '} {' '} {' '} {' 1 1 1 1 1'}

Categories

Find more on Data Type Conversion in Help Center and File Exchange

R2020b

Community Treasure Hunt

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

Start Hunting!