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

2 Ansichten (letzte 30 Tage)
aamir irshad
aamir irshad am 27 Jun. 2018
Kommentiert: aamir irshad am 27 Jun. 2018
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 Kommentare
Paolo
Paolo am 27 Jun. 2018
In your input there is a sequence of 6 1s which become 5 1s. Is that also a requirement?
aamir irshad
aamir irshad am 27 Jun. 2018
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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Stephen23
Stephen23 am 27 Jun. 2018
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

Weitere Antworten (2)

Jan
Jan am 27 Jun. 2018
Bearbeitet: Jan am 27 Jun. 2018
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 Kommentar
aamir irshad
aamir irshad am 27 Jun. 2018
Its also working perfectly.
Thank you, Jan for another efficient logic.
BR,
Aamir

Melden Sie sich an, um zu kommentieren.


Ameer Hamza
Ameer Hamza am 27 Jun. 2018
Bearbeitet: Ameer Hamza am 27 Jun. 2018
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 Kommentare
Ameer Hamza
Ameer Hamza am 27 Jun. 2018
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.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by