The longest consecutive values in a vector and the position at which it starts and ends
조회 수: 2 (최근 30일)
이전 댓글 표시
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
Geoff Hayes
2021년 10월 13일
@Yaser Khojah - is this homework? What have you tried so far? What are the dimensions of the large matrix?
채택된 답변
Star Strider
2021년 10월 13일
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
Star Strider
2021년 10월 14일
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!
.
추가 답변 (2개)
Matt J
2021년 10월 13일
편집: Matt J
2021년 10월 13일
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
Image Analyst
2021년 10월 14일
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
참고 항목
카테고리
Help Center 및 File Exchange에서 Resizing and Reshaping Matrices에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!