8 views (last 30 days)

Show older comments

A = [5 1 1 1 6 1 1 1 1 1 1 1 7 1 1 1 7]

I would like to sum the highest consecutive numbers those are less than 2. In this case, there three 1 at the beginning and at the end but those will not be counted because there are 7 consecutive 1 at the middle. And I am looking for highest consecutive numbers those are less than 2 that's why the answer would be 1+1+1+1+1+1+1=7.

Image Analyst
on 9 Apr 2018

You could do this:

A = [5 1 1 1 6 1 1 1 1 1 1 1 7 1 1 1 7] % Assume A is all integers.

% Get unique integers in A

ua = unique(A)

for k = 1 : length(ua)

thisNumber = ua(k)

% Measure lengths of all regions comprised of this number.

props = regionprops(A==thisNumber, A, 'Area')

% Get maximum length for this number in A.

maxAreas(k) = max([props.Area])

end

maxAreas % Show in command window.

Image Analyst
on 11 Apr 2018

My code still works with your new, floating point numbers:

% A = [5 1 1 1 6 1 1 1 1 1 1 1 7 1 1 1 7] % Assume A is all integers.

A = [5 1 1 1 6 1 .5 .8 .55 .65 .95 1 7 1 1 1 7]

% Get unique numbers in A

ua = unique(A)

for k = 1 : length(ua)

thisNumber = ua(k);

% Measure lengths of all regions comprised of this number.

props = regionprops(A==thisNumber, A, 'Area');

% Get maximum length for this number in A.

maxAreas(k) = max([props.Area]);

fprintf('%.2f shows up %d times.\n', thisNumber, maxAreas(k));

end

I added an fprintf() to show you the results:

0.50 shows up 1 times.

0.55 shows up 1 times.

0.65 shows up 1 times.

0.80 shows up 1 times.

0.95 shows up 1 times.

1.00 shows up 3 times.

5.00 shows up 1 times.

6.00 shows up 1 times.

7.00 shows up 1 times.

Note the count (area) is only the length of the longest run, not a count of all the times the number appears. Thus 1 gives 3, not 8.

David Fletcher
on 9 Apr 2018

Edited: David Fletcher
on 9 Apr 2018

A = [5 1 1 1 6 1 1 1 1 1 1 1 7 1 1 1 7]

B=int32(A==min(A));

[startInd lastInd]=regexp(char(B+48),'[1]+');

counts=lastInd-startInd+1;

sumContinuous=max(counts)

David Fletcher
on 10 Apr 2018

Roger Stafford
on 11 Apr 2018

Edited: Roger Stafford
on 11 Apr 2018

L = min(A);

f = find(diff([false,A==L,false])~=0);

h = L*max(f(2:2:end)-f(1:2:end-1));

h is the highest sum of consecutive lowest values.

[Note: You should be careful how your fractions are generated. You might have, say, two consecutive values which appear equal to the minimum value, .2, .2, but which are not exactly equal. These would not be detected as part of a consecutive sequence of least values.]

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

Start Hunting!