在二进制数据中将后续1更改为0

时间:2016-08-17 01:00:56

标签: arrays matlab binary

嗨我有一个二进制变量(称为'列'大小为733x1)并且为了更改我在1到1之间的0到1#s (即00001110011 ...至00001111111 ......)。我正在使用:

column_fill = column;
column_fill(find(column == 1, 1):find(column == 1, 1, 'last')) = 1;

我想将此更改为如果我的变量中有一系列1,后跟一系列5个或更多0' s,则所有其他1更改为0&# 39; S。 Link to data。输出(从000..0001110000011101 ...到000..0000000000011111 ...)谢谢。

另外,如果在1组之前有单个1,那么我会很感激帮助添加一个额外的部分(对于我的代码中的其他地方)然后将它们更改为0' s。输出(从000..000111110001到000..000111110000)。谢谢。

data 2

2 个答案:

答案 0 :(得分:2)

以下是提出问题的一般方法"在column100向量上。我制作了一小组变量,以汇总的方式汇总了这个载体的所有信息,这使得所有这类测试变得更加容易:

首先,我创建了三个带有基本信息的向量:

row_c = fliplr(column100.'); % your questions are "right to left" (The .' is not really needed)
d = diff([row_c(1) row_c]); % find all switches between 1 to 0 or 0 to 1
len = 1:numel(row_c); % make a list of all indices in row_c
idx = [len(d~=0)-1 numel(row_c)] % the index of the end each group
counts = [idx(1) diff(idx)] % the number of elements in the group
elements = row_c(idx) % the type of element (0 or 1)
n_groups = numel(idx) % the no. of groups in the vector

到目前为止的输出:

idx =
   195   199   205   207   235   256   272   733
counts =
   195     4     6     2    28    21    16   461
elements =
     1     0     1     0     1     0     1     0
n_groups =
     8

因此我们可以看到数据由8个组组成,例如,第三组来自200:205,它是一组1,它有6个元素。

现在我们可以使用这些数据执行不同的任务:

任务1

我们的首要任务是找到counts的小组(1> 2),后面跟着一组至少5 0的小组:

for k = 1:n_groups-1
    % elements(k) --> is this a group of '1'? (it will always be followed by a '0')
    % counts(k)>1 --> is this a series of at least '11'?
    % counts(k+1)>4 --> is it followed by at least '00000'?
    if elements(k) && counts(k)>1 && counts(k+1)>4
        row_c(idx(k)+1:end)=0; % if so, change all following '1' to zeros
        break % and end the loop since all following pairs were removed.
    end
end

我们现在可以检查并查看(通过再次运行上面的代码而不需要第一行):

idx =
   195   199   205   207   235   733
counts =
   195     4     6     2    28   498
elements =
     1     0     1     0     1     0
n_groups =
     6

任务2

第二项任务是"擦拭" (更改为0)所有单身1,如果后面跟着一组至少两个1 s:

for k = 1:n_groups-2
    % elements(k) --> is this a group of '1'?
    % counts(k)==1 --> is it single?
    % counts(k+2)>1 --> the next '1' is not single?
    if elements(k) && counts(k)==1 && counts(k+2)>1
        row_c(idx(k))=0; % change the single '1' to '0'.
    end
end

数据不包含任何单个1,但如果有此代码,则会将其更改为0

任务3

这是来自您的comment to @Tasos answer - 在最后0之前更改所有11

for k = n_groups:-1:1
    if elements(k) % is this the last group of '1'?
        row_c(1:idx(k))=1; % change all prior '0' to '1'
    end
end

我们可以再次查看(通过在没有第一行的情况下再次运行上面的第一个代码块):

idx =
   272   733
counts =
   272   461
elements =
     1     0
n_groups =
     2

现在我们只有两个小组,其中一个是0在最后一个1之后的一个,另一个用于现在更改为1的所有其他向量。

答案 1 :(得分:1)

您可以转换为字符串序列并使用字符串/正则表达式操作。 e.g:

c = char(column100'+48);                % convert to string
C = regexp(c, '1.+00000', 'match');     % regular expression.
c2 = strrep(c,C{1},strrep(C{1},'1','0')); % assumes 1 match here, adapt
                                          % appropriately for general case
newcolumn = logical(double(c-48)'); % convert back to logical vector.

同样,您可以使用'010.*'正则表达式作为第二位 如果您不知道正则表达式是什么,请键入help regexp