The longest consecutive values in a vector and the position at which it starts and ends

3 Ansichten (letzte 30 Tage)
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 Kommentare
Geoff Hayes
Geoff Hayes am 13 Okt. 2021
@Yaser Khojah - is this homework? What have you tried so far? What are the dimensions of the large matrix?
Yaser Khojah
Yaser Khojah am 13 Okt. 2021
It is a large project, however, I have the code in a different computer which I do not have an access to it. I have tried using diff.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Star Strider
Star Strider am 13 Okt. 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_Answer = 30
Desired_Start = Start(Idx)
Desired_Start = 6
Desired_End = End(Idx)
Desired_End = 10
.
  8 Kommentare
Star Strider
Star Strider am 14 Okt. 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_Answer = 30
Desired_Start = Startv
Desired_Start = 6
Desired_End = Endv
Desired_End = 10
Definitely an interesting problem!
.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (2)

Matt J
Matt J am 13 Okt. 2021
Bearbeitet: Matt J am 13 Okt. 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))
The_Answer = 30
Starting_index = starts(i)
Starting_index = 6
Ending_index = stops(i)
Ending_index = 10
  3 Kommentare
Matt J
Matt J am 14 Okt. 2021
Really? It doesn't look like anyone has downloaded it recently.
Yaser Khojah
Yaser Khojah am 14 Okt. 2021
I want to use it but I cant dowload this code in my project machine.

Melden Sie sich an, um zu kommentieren.


Image Analyst
Image Analyst am 14 Okt. 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

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by