Different groups of 1s
조회 수: 1 (최근 30일)
이전 댓글 표시
Have been trying to solve this, but couldn't
Any help would be appreciated
I have an array A=[-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1]
i want to get different groups of 1s like group1 contains ones with length 1 (for consecutive ones), second group contains ones with length 2 ,etc.
same approach for -1s
For 1s output shoud be [ 3 0 0 0 0 0 0 0 0 0 0 0 0 0 ]
For -1s outputs shd be [3 0 1 1 0 0 0 0 0 0 0 0 0 0 ].
댓글 수: 1
채택된 답변
Jan
2021년 3월 25일
편집: Jan
2021년 3월 25일
See FEX: RunLength
If speed matters, compile the c file according to the instructions. If the problems are such tiny, it is sufficient to use the M-verion RunLength_M:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
value = 1;
[B, N] = RunLength_M(A == value);
Result = histcounts(N(B), 1:numel(A))
% [4 0 0 0 0 0 0 0 0 0 0 0 0 0] not [3 0 0 ...]
value = -1;
[B, N] = RunLength_M(A == value);
Result = histcounts(N(B), 1:numel(A))
% [3 0 1 1 0 0 0 0 0 0 0 0 0 0]
If RunLength_M is still an overkill for you, use:
function [b, n] = RunLengthEnc(x)
d = [true; diff(x(:)) ~= 0]; % TRUE if values change
b = x(d); % Elements without repetitions
k = find([d', true]); % Indices of changes
n = diff(k); % Number of repetitions
end
And if histcounts is too powerful also, a simple loop prodiuces the same result:
function H = myHist(N, Len)
H = zeros(1, Len);
for k = 1:numel(N)
H(N(k)) = H(N(k)) + 1;
end
end
Then the the main code looks like:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
value = 1;
[B, N] = RunLengthEnc(A == value);
Result = myHist(N(B), numel(A))
Or with 1 and -1 in the same run:
[B, N] = RunLengthEnc(A);
Result = myHist(N(B == 1), numel(A))
Result = myHist(N(B == -1), numel(A))
댓글 수: 3
Jan
2021년 3월 30일
Without subfunctions? Then simply copy the code into the main function:
A = [-1 1 -1 -1 -1 -1 1 -1 1 -1 1 -1 -1 -1];
d = [true; diff(x(:)) ~= 0]; % TRUE if values change
b = x(d); % Elements without repetitions
k = find([d', true]); % Indices of changes
n = diff(k); % Number of repetitions
Result = histcounts(n(b == 1), 1:numel(A))
Result = histcounts(n(b == -1), 1:numel(A))
참고 항목
카테고리
Help Center 및 File Exchange에서 Multirate Signal Processing에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!