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

KSSV
KSSV 2016년 1월 6일
one represnetative for each group of 1? Question not clear. Can you type expected result into a matrix?
And what if there are an even number of ones?
A = [0;1;1;0]
what output do you want?
Meshooo
Meshooo 2016년 1월 6일
I don't care which right or left to take in case of even number of ones.
A = [0;0;1;0]
or
A = [0;1;0;0]
Any answer is OK.

댓글을 달려면 로그인하십시오.

 채택된 답변

Guillaume
Guillaume 2016년 1월 6일

1 개 추천

It's very simple:
diff([0; A]) == 1
simply detects all transition from 0 to 1 and return them as 1.

댓글 수: 1

Guillaume
Guillaume 2016년 1월 7일
Note that this keeps just the first 1 of a block as opposed to the middle 1 of a block, which the other solutions do.

댓글을 달려면 로그인하십시오.

추가 답변 (3개)

goerk
goerk 2016년 1월 6일

0 개 추천

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

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
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
Stephen23 2016년 1월 6일

0 개 추천

>> 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
Meshooo
Meshooo 2016년 1월 7일

0 개 추천

Thank you all for the kind help and suggestions.

카테고리

도움말 센터File Exchange에서 Startup and Shutdown에 대해 자세히 알아보기

태그

질문:

2016년 1월 6일

댓글:

2016년 1월 7일

Community Treasure Hunt

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

Start Hunting!

Translated by