find sum of the run length of non zero elements between zeros of a matrix

3 Ansichten (letzte 30 Tage)
suppose my matrix is
a=[ 1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0 ]
output wanted is
[6 15 15 9]

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 10 Jul. 2021
a = [ 1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0 ]
a = 1×19
1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0
mask = logical(a);
starts = strfind([0 mask], [0 1]);
stops = strfind([mask 0], [1 0]) + 1;
ca = cumsum([0 a]);
ca(stops) - ca(starts)
ans = 1×4
6 15 15 9

Weitere Antworten (4)

Soniya Jain
Soniya Jain am 10 Jul. 2021
a=[ 1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0 ];
j = 0;
i = 1;
while i ~= (length(a)+1)
if a(i)~=0
sum = 0;
while a(i)~=0
sum = sum + a(i);
i = i + 1;
end
j = j + 1;
res(j) = sum;
end
i = i + 1;
end
Here is the code of it, but if you are not familiar with how to write MATLAB code, then you can start with the MATLAB Onramp tutorial to quickly learn the essentials of MATLAB.
  2 Kommentare
PRIYAM DEKA
PRIYAM DEKA am 10 Jul. 2021
this code works but if the last element is non zero the code doesnot work.
though it can be corrected by defining a=[a 0] before the while loop.
thank you

Melden Sie sich an, um zu kommentieren.


Simon Chan
Simon Chan am 10 Jul. 2021
a=[ 1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0 ];
pos=diff(a)<0; % Position before hitting a zero
c=cumsum(a); % Cumulative sum
d=[0 c(pos)]; % Add a zero in the first position, otherwise first value will be lost
diff(d)

Matt J
Matt J am 10 Jul. 2021
Bearbeitet: Matt J am 10 Jul. 2021
Using this File Exchange submission
it is quite easy.
result=groupFcn(@sum, a, groupTrue(a~=0))

Image Analyst
Image Analyst am 11 Jul. 2021
Here's another way:
a = [ 1 2 3 0 0 0 4 5 6 0 0 0 7 8 0 0 9 0 0 ]
% Extract each run:
props = regionprops(logical(a), a, 'PixelValues')
% Sum up each run.
for k = 1 : length(props)
theSums(k) = sum(props(k).PixelValues)
end

Community Treasure Hunt

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

Start Hunting!

Translated by