嗨我有一个二进制变量(称为'列'大小为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)。谢谢。
答案 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个元素。
现在我们可以使用这些数据执行不同的任务:
我们的首要任务是找到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
第二项任务是"擦拭" (更改为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
。
这是来自您的comment to @Tasos answer - 在最后0
之前更改所有1
到1
:
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