How to pick group sum values from an array

8 visualizzazioni (ultimi 30 giorni)
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.
Answer like X1=sum(5+1+1+3+5)=15;
But I need X2=groupsum[5 3 5];
How can I do this.
Thanks,
  1 Commento
Stephen23
Stephen23 il 2 Dic 2022
X = '1111100000000010000000100011100011111';
[S,E] = regexp(X,'1{3,}');
N = E-S+1
N = 1×3
5 3 5

Accedi per commentare.

Risposta accettata

William Rose
William Rose il 28 Nov 2022
Modificato: William Rose il 28 Nov 2022
[edit: correct a typo in one of the comment lines in the code, fix indenting, add comments]
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.
  4 Commenti
Stephen23
Stephen23 il 2 Dic 2022
Modificato: Stephen23 il 2 Dic 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
William Rose il 2 Dic 2022
THank you @Stephen23. Those are nice to know about.

Accedi per commentare.

Più risposte (2)

chrisw23
chrisw23 il 28 Nov 2022
Modificato: chrisw23 il 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
Vilém Frynta il 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'}

Categorie

Scopri di più su Data Type Conversion in Help Center e File Exchange

Tag

Prodotti


Release

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by