How to pad extra 0 after 5 consecutive 1's in an array

조회 수: 2 (최근 30일)
aamir irshad
aamir irshad 2018년 6월 27일
댓글: aamir irshad 2018년 6월 27일
I need to insert extra 0 in a large array after consecutive 5 ones e.g, if
a=[0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0]..........so on
output array should be
b=[0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 ]..........so on
Thanks in advance
  댓글 수: 2
Paolo
Paolo 2018년 6월 27일
In your input there is a sequence of 6 1s which become 5 1s. Is that also a requirement?
aamir irshad
aamir irshad 2018년 6월 27일
thanks for your reply. Yes, I can explain it a bit more e.g. if we have a= [1 1 1 1 1 1 1 1 1 1 1 1] the output should be b= [1 1 1 1 1 0 1 1 1 1 1 0 1 1] The logic should insert an extra 0 after consecutive 5 ones start looking from the beginning of data.

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

채택된 답변

Stephen23
Stephen23 2018년 6월 27일
Simpler:
>> a = [0 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 1 1 1 0];
>> b = regexprep(char(a+'0'),'11111','111110')-'0'
b =
0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0
>> c = [0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0 ] % your requested output
c =
0 1 1 1 1 1 0 0 1 1 1 1 1 0 1 0 0 1 1 1 1 1 0 0
  댓글 수: 1
aamir irshad
aamir irshad 2018년 6월 27일
Hi Stephen,
This is most efficient. Thanks for your help.
BR,
Aamir

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

추가 답변 (2개)

Jan
Jan 2018년 6월 27일
편집: Jan 2018년 6월 27일
a = [1 1 1 1 1 1 1 1 1 1 1 1];
b = a;
idx = strfind(a, [1,1,1,1,1])
if ~isempty(idx)
% Remove indices with a too short distance:
p = idx(1);
for k = 2:numel(idx)
if idx(k) - p < 5
idx(k) = 0;
else
p = idx(k);
end
end
idx = idx(idx ~= 0) + 4;
%
b = cat(1, b, nan(size(b))); % Pad with NaNs
b(2, idx) = 0; % Insert zeros
b = b(~isnan(b)).'; % Crop remaining NaNs
end
This avoids changing the size of the output array in each iteration, which should be more efficient for large data sets.
  댓글 수: 1
aamir irshad
aamir irshad 2018년 6월 27일
Its also working perfectly.
Thank you, Jan for another efficient logic.
BR,
Aamir

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


Ameer Hamza
Ameer Hamza 2018년 6월 27일
편집: Ameer Hamza 2018년 6월 27일
Try this
a= [1 1 1 1 1 1 1 1 1 1 1 1];
b = a;
count = 1;
while true
index = strfind(b(count:end), [1 1 1 1 1])+5;
if isempty(index)
break
end
index = index(1);
count = count+index-1;
b = [b(1:count-1) 0 b(count:end)];
end
b
b =
Columns 1 through 13
1 1 1 1 1 0 1 1 1 1 1 0 1
Column 14
1
  댓글 수: 5
Ameer Hamza
Ameer Hamza 2018년 6월 27일
The code finds the first occurrence of [1 1 1 1 1] in the array and add a zero after that. In the next iteration, it skips the first part of the array and searches the remaining array. If another occurrence of 5 1s is found, it will again add zero and search the remaining array. It will continue until all the groups of 5 1s have passed.
You can set a breakpoint at first line of the code and execute the each line one by one to better understand the logic.
aamir irshad
aamir irshad 2018년 6월 27일
Thanks a lot

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

카테고리

Help CenterFile Exchange에서 Matrices and Arrays에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by