The longest consecutive values in a vector and the position at which it starts and ends
    11 views (last 30 days)
  
       Show older comments
    
    Yaser Khojah
      
 on 13 Oct 2021
  
    
    
    
    
    Answered: Image Analyst
      
      
 on 14 Oct 2021
            I have a large matrix where I want to find the value that has been repeated the most. Then define its starting and ending indexes. For example 
Thanks for the help in advanse!
A = [35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30]
The solution should be as below
The_Answer     =  30
Starting_index = 6;
Ending_index   = 10
2 Comments
  Geoff Hayes
      
      
 on 13 Oct 2021
				@Yaser Khojah - is this homework? What have you tried so far? What are the dimensions of the large matrix?
Accepted Answer
  Star Strider
      
      
 on 13 Oct 2021
        One approach — 
A = [35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30];
[Au,~,ix] = unique(A, 'stable');
Tally = accumarray(ix,1);
HiFreq = Au(Tally==max(Tally));
Lv = false(size(A));
Lv(A==HiFreq) = true;
Start = strfind(Lv, [0 1])+1;
End = [strfind(Lv,[1 0]) numel(A)];
Len = End - Start;
[~,Idx] = max(Len);
Desired_Answer = HiFreq
Desired_Start = Start(Idx)
Desired_End = End(Idx)
.
8 Comments
  Star Strider
      
      
 on 14 Oct 2021
				This appears to work correctly for all of them, and with only minor changes in my original code.  
To test it, un-comment (remove the ‘%’) from the ‘A’ vector to test , then run the code.  (Keep the ‘%’ for the others not being tested.  I included my original ‘Test’ vector as well in the ‘A Library’ of test vectors. The fprintf call allowed me to keep track of the loop iterations easily.  I’m leaving it in, although commented so it won’t execute.)  
A = [35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30];
% A = [30, 30, 30, 30, 30, 30, 30, 30, 35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30];    % Test
% A = [9 9  8 9 8 8 8 7 2 1];
% A = [9 9  8 8 8 7 2 9 3];
% A = [9 9 9  8 8 8 7 2 9 3];
% A = [9  8  7 6  8 7 2 9 3];
[Au,~,ix] = unique(A, 'stable');
Tally = accumarray(ix,1);
HiFreq = Au(Tally==max(Tally));
% Lv = false(size(A));
for k = 1:numel(HiFreq)
    Element = HiFreq(k);
    Lv = false(size(A));
    Lv(A==HiFreq(k)) = true;
    Lv = [false Lv];
    Start = strfind(Lv, [0 1]);
    End = unique([strfind(Lv,[1 0]) numel(A)]-1);
    minidx = min(numel(Start),numel(End));
    EndStt = [End(1:minidx); Start(1:minidx)];
    Len = End(1:minidx) - Start(1:minidx);
    [~,Idx(k)] = max(Len);
    EndStart(:,k)  = EndStt(:,Idx(k));
%     fprintf('-------------------------\n')
end
HiFreqv = [];
Startv = [];
Endv = [];
Check = -diff(EndStart);
if all(Check)
    [~,IxES] = max(-diff(EndStart));
    HiFreqv = HiFreq(IxES);
    Startv = EndStart(2,IxES);
    Endv = EndStart(1,IxES);
end
Desired_Answer = HiFreqv
Desired_Start = Startv
Desired_End = Endv
Definitely an interesting problem!  
.
More Answers (2)
  Matt J
      
      
 on 13 Oct 2021
        
      Edited: Matt J
      
      
 on 13 Oct 2021
  
      Using "Tools for Processing Consecutive Repetitions in Vectors",
A = [35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30];
[starts,stops,lengths]=groupLims(groupConsec(A),1);
[~,i]=max(lengths);
The_Answer     =  A(starts(i))
Starting_index = starts(i)
Ending_index   = stops(i)
3 Comments
  Image Analyst
      
      
 on 14 Oct 2021
        If you have the Image Processing Toolbox (like most people do), you can use bwareafilt() to extract the longest run.  Then the code becomes simply:
A = [35, 25, 40, 20, 20, 30, 30, 30, 30, 30, 9, 20, 30, 10, 30]
da = bwareafilt([0, diff(A)] == 0, 1)
startingIndex = max([1, find(da, 1, 'first')-1])
endingIndex = find(da, 1, 'last')
You see
A =
    35    25    40    20    20    30    30    30    30    30     9    20    30    10    30
da =
  1×15 logical array
   0   0   0   0   0   0   1   1   1   1   0   0   0   0   0
startingIndex =
     6
endingIndex =
    10
0 Comments
See Also
Categories
				Find more on Manage Products in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



