danjoro
danjoro

Reputation: 111

Finding middle point for consecutive number

Let say I have

A=[1 3 4 5 6 7 9 12 15 16 17 18 20 23 24 25 26];

My interest is how to find the middle value between consecutive numbers using Matlab.

For example, first group of consecutive numbers is

B=[3 4 5 6 7];

so the answer should be is 5. The 2nd group of consecutive numbers (i.e. [15 16 17 18]) should give 16 etc...

At the end, my final answer is

[5 16 24]

Upvotes: 1

Views: 1215

Answers (3)

Divakar
Divakar

Reputation: 221624

diff + strfind based approach -

loc_consec_nums = diff(A)==1 %// locations of consecutive (cons.) numbers
starts = strfind([0 loc_consec_nums],[0 1]) %// start indices of cons. numbers
ends = strfind([loc_consec_nums 0],[1 0]) %// end indices of cons. numbers
out = A(ceil(sum([starts ; ends],1)./2))%// median of each group of starts and ends
              %// and finally index into A with them for the desired output

Upvotes: 1

Dan
Dan

Reputation: 45752

Here is a vectorized approach:

d = [diff(A) == 1, 0];
subs = cumsum([diff(d) == 1, 0]).*(d | [0, diff(d) == -1]) + 1
temp = accumarray(subs', A', [], @median)
final = floor(temp(2:end))

Upvotes: 3

Benoit_11
Benoit_11

Reputation: 13945

Here is some sample code which does what you are looking for. I'll let you play with the different outputs to see what they do exactly, although I wrote some comments to follow:

clear
clc

A=[1 3 4 5 6 7 9 12 15 16 17 18 20 23 24 25 26]

a=diff(A); %// Check the diff array to identify occurences different than 1.

b=find([a inf]>1);
NumElements=diff([0 b]); %//Number of elements in the sequence

LengthConsec = NumElements((NumElements~=1)) %// Get sequences with >1 values
EndConsec = b(NumElements~=1) %// Check end values to deduce starting values
StartConsec = EndConsec-LengthConsec+1;

%// Initialize a cell array containing the sequences (can have ifferent
%lengths, i.e. an array is not recommended) and an array containing the
%median values.
ConsecCell = cell(1,numel(LengthConsec));
MedianValue = zeros(1,numel(LengthConsec));

for k = 1:numel(LengthConsec)

    ConsecCell{1,k} = A(StartConsec(k):1:EndConsec(k));
    MedianValue(k) = floor(median(ConsecCell{1,k}));
end

%//Display the result
MedianValue

Giving the following:

MedianValue =

     5    16    24

Upvotes: 2

Related Questions