How to filter an array?
조회 수: 12 (최근 30일)
이전 댓글 표시
Dear all,
I have this array
A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
I want only one representative for each group of ones. So how to make
A = [0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;1;0;0;0;0];
Any help will be appreciated.
Best, Meshoo
댓글 수: 3
Stephen23
2016년 1월 6일
And what if there are an even number of ones?
A = [0;1;1;0]
what output do you want?
채택된 답변
추가 답변 (3개)
goerk
2016년 1월 6일
A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
% A = [0;1;1;0;1;1;1];
dA = diff(A);
ind = 1:length(A);
startInds = ind(dA>0)+1;
endInds = ind(dA<0);
if length(endInds)<length(startInds) %last value is 1
endInds(end+1) = length(A);
end
midInd = floor((startInds+endInds)/2); % when even choose left
% midInd = ceil((startInds+endInds)/2); % when even choose right
B = zeros(size(A));
B(midInd) = 1;
[A B] % show result, to check input and output
댓글 수: 2
Guillaume
2016년 1월 6일
Your answer will fail if the first element of A is 1. And if it starts and ends with 1, the start and end offsets will be completely wrong due to the way you detect that the last value is 1.
The best way to solve both is to prepend and append A with 0 before the diff:
dA = diff([0 A 0]); %guarantees you have the same number of starts and ends.
midInd = floor((find(dA > 0) + find(dA < 0) - 1) / 2); %much simpler way of calculating mid indices
goerk
2016년 1월 6일
You are right, for a 1 at the first position my will fail. Thanks for your very nice and short solution. With the correct concatenation it works fine.
dA = diff([0; A; 0]);
Stephen23
2016년 1월 6일
>> A = [0;0;0;0;0;0;1;1;1;0;0;0;0;0;0;1;0;0;0;0];
>> X = find(diff([0;A;0]));
>> Z = zeros(size(A));
>> Z(fix((X(1:2:end)+X(2:2:end)-1)/2)) = 1
Z =
0
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
0
0
0
댓글 수: 0
참고 항목
카테고리
Help Center 및 File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!