How to group values in a vector based on certain condition?
조회 수: 5 (최근 30일)
이전 댓글 표시
I have a row vector that has values 1 to 5 that keeps repeating like a cycle as following.
row = [1; 2; 3; 4; 5; 1; 1; 2; 3; 4; 5; 5; 1; 1; 2; 2; 3; 4; 5; 5]
I need to group this data taking 1 and 5 as reference. If the 1 or 5 is occuring more than once consecutively, consider the first 1 and last 5.
Ans =
[1 2 3 4 5 0 0 0;
1 1 2 3 4 5 5 0;
1 1 2 2 3 4 5 5 ]
Any ideas?
Thanks
댓글 수: 0
채택된 답변
Voss
2022년 3월 27일
If the sub-sequence always starts with a 1 and ends with a 5, you could do this:
row = [1; 2; 3; 4; 5; 1; 1; 2; 3; 4; 5; 5; 1; 1; 2; 2; 3; 4; 5; 5];
start_val = 1;
end_val = 5;
cycle_end_idx = [0; find(diff(row) == start_val-end_val); numel(row)]
n_cycles = numel(cycle_end_idx)-1;
cycle_length = diff(cycle_end_idx);
M = zeros(n_cycles,max(cycle_length));
for ii = 1:n_cycles
M(ii,1:cycle_length(ii)) = row(cycle_end_idx(ii)+1:cycle_end_idx(ii+1));
end
disp(M);
Ultimately, however, you may find that it's better to store those sub-sequences in a cell array rather than a matrix with extra zeros:
C = cell(1,n_cycles);
for ii = 1:n_cycles
C{ii} = row(cycle_end_idx(ii)+1:cycle_end_idx(ii+1)).';
end
format compact
celldisp(C);
댓글 수: 6
Voss
2022년 5월 2일
What should be the output for row = [0;1;1;2;2;3;4;5;0;1;2;3;4;5;5;0;1;1;2;4;5;0;1;2;3;4;5] with imposed cycle length (i.e., desired number of columns in output matrix) of 5?
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Measurements and Feature Extraction에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!