如何从向量非零值中过滤出小于n个索引的向量中的值?

时间:2014-02-06 15:59:09

标签: matlab vectorization

我有一个双打矢量,我按照以下方式设定了阈值:

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变量很长,所以我想知道是否可以使用矢量化解?

2 个答案:

答案 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;