# Removing zeros from a binary array if length of zeros is lesser than a value

조회 수: 2(최근 30일)
Hello,
I have an array:
input = [0;0;0;0;0;0;0;1;0;1;1;1;0;0;0;0;0;0;1;1;0;0;0;0]
I would like to remove only the 0's between the 1's if the stretch of 0's is lesser than 5, between the 1's. So, for this instance, the output would look something like:
output = [0;0;0;0;0;0;0;1;1;1;1;0;0;0;0;0;0;1;1;0;0;0;0].
Any help would be appreciated.
Thanks!

로그인 to comment.

### 채택된 답변

KSSV 19 Feb 2020
input = [0;0;0;0;0;0;0;1;0;1;1;1;0;0;0;0;0;0;1;1;0;0;0;0] ;
idx = input==1; % get the locations of 1
% split zeros and one's into cell
idr = diff(find([1;diff(idx);1]));
D = mat2cell(input,idr(:),size(input,2));
% get the lengths of each cell
L = cellfun(@length,D) ;
L(2:2:end) = NaN ; % make length of 1's NaN as it is not needed
% get the length of zeros which are less then 4
id = L<4 ;
% remove those zeros
D(id) = [] ;
% convert to matrix
output = cell2mat(D) ;

#### 댓글 수: 5

표시 이전 댓글 수: 2
I tried that. However, I get the error, "Conversion to cell from double is not possible."
Stephen Cobeldick 19 Feb 2020
The RHS would need to be a scalar cell array:
D(id) = {1};
Stephen,
Some of the cells have zeros of varying lengths. Replacing it with {1} would simply reduce the entire cell content to 1. Should I run a for loop to find and replace the zero's between the 1's using values stored in "L = cellfun(@length,D);" ?

로그인 to comment.

### 추가 답변(1개)

Raymond MacNeil 19 Feb 2020
k = [0;0;0;0;0;0;0;1;0;1;1;1;0;0;0;0;0;0;1;1;0;0;0;0];
y = regexp(num2str(k)', '(?<=[0]{5,})0*', 'split');
z = strjoin(cellfun(@(x) replace(x, '', ' '), y, 'UniformOutput', false));
out = str2num(z)';

#### 댓글 수: 1

Raymond MacNeil 19 Feb 2020
Could also use regexprep. I realize I added more steps than was necessary. Also, other ways exist that don't require regexp. This just happened to be the first solution that came to mind.

로그인 to comment.

이 질문에 답변하려면 로그인을(를) 수행하십시오.

Translated by