Matlab 如何从前面的非零值中筛选出向量中小于n个索引的值?

Matlab 如何从前面的非零值中筛选出向量中小于n个索引的值?,matlab,vectorization,Matlab,Vectorization,我有一个双倍向量,我的阈值如下: v = rand(1, 100); thresh = v > .5; thresh变量现在包含布尔值。我想过滤掉紧跟在另一个true值之后的所有true值,严格小于n个索引。为了回答这个问题,我们将n设置为3。因此,给定一段v[1 0 0 0 0 1 0 1],我想对其进行过滤,以获得[1 0 0 0 0 0 0 1 0 0] 这可以在循环中完成,但我的v变量相当长,所以我想知道向量化解决方案是否可行?所有实现这一点的方法都是相同技巧的变体。 ind =

我有一个双倍向量,我的阈值如下:

v = rand(1, 100);
thresh = v > .5;
thresh
变量现在包含布尔值。我想过滤掉紧跟在另一个
true
值之后的所有
true
值,严格小于n个索引。为了回答这个问题,我们将n设置为
3
。因此,给定一段
v
[1 0 0 0 0 1 0 1]
,我想对其进行过滤,以获得
[1 0 0 0 0 0 0 1 0 0]


这可以在循环中完成,但我的
v
变量相当长,所以我想知道向量化解决方案是否可行?

所有实现这一点的方法都是相同技巧的变体。
ind = bsxfun(@plus, find(thresh(1:end-n+1)), (1:n-1).');
thresh(unique(ind(:))) = 0;
首先构造你可能保留的所有1的向量。然后用原始向量“AND NOT”它

在您的示例中,遮罩向量是 [01101001]

要得到这个向量,有两种不同的方法。一种是使用稀疏矩阵乘法。可以使用spdiags构造所需的稀疏矩阵

tlen = length(thresh);
d = spdiags(ones(tlen, n-1),1:(n-1),tlen,tlen);
mask = thresh * d;
然后带着面具的“与非”

thresh = thresh & ~mask;