我有一个双打矢量,我按照以下方式设定了阈值:
v = rand(1, 100);
thresh = v > .5;
thresh
变量现在包含布尔值。我想通过严格小于 n 的索引过滤掉跟随另一个true
值的所有true
值。为了这个问题,我们将 n 设置为3
。因此,给定一段v
[1 0 0 0 0 0 0 1 0 1]
,我想对其进行过滤以获得[1 0 0 0 0 0 0 1 0 0 ]
。
这可以在循环中完成,但我的v
变量很长,所以我想知道是否可以使用矢量化解?
答案 0 :(得分:1)
ind = bsxfun(@plus, find(thresh(1:end-n+1)), (1:n-1).');
thresh(unique(ind(:))) = 0;
答案 1 :(得分:1)
所有这些方法都是同一个技巧的变种。 首先构建你可能保留的所有1的向量。然后用原始矢量'而不是'。
在你的例子中,掩码矢量将是 [0 1 1 0 0 0 0 0 1 1]
要获得此向量,有几种不同的方法。一个是稀疏矩阵乘法。您可以使用spdiags构建所需的稀疏矩阵
tlen = length(thresh);
d = spdiags(ones(tlen, n-1),1:(n-1),tlen,tlen);
mask = thresh * d;
然后'和'使用面具
thresh = thresh & ~mask;