2

我有以下问题。假设我有一个向量:

v = [1,2,3,4,5,1,2,3,4,...]

我想从向量中按顺序对点进行采样,这些点的绝对差值高于先前采样点的阈值。所以说我的门槛是2。

我从索引 1 开始,对第一个点 1 进行采样。然后在 v[3] 处满足我的条件,我对 3 进行采样(因为 3-1 >= 2)。然后 3,新的采样点成为我检查的参考点。下一个采样点是 5,即 v[5] (5-3 >= 2)。然后下一点是 1,即 v[6] (abs(1-5) >= 2)。

不幸的是,我在 R 中的代码耗时太长。基本上我正在反复扫描数组并寻找匹配项。我认为这种方法很幼稚。我有一种感觉,我可以通过阵列一次完成这项任务。我不知道如何。任何帮助表示赞赏。我想我遇到的问题是下一个采样点的位置可以在数组中的任何位置,我需要从当前点扫描数组到末尾才能找到它。

谢谢。

4

2 回答 2

12

我看不出没有循环可以做到这一点,所以这里有一个:

my.sample <- function(x, thresh) {
   out <- x
   i <- 1
   for (j in seq_along(x)[-1]) {
      if (abs(x[i]-x[j]) >= thresh) {
         i <- j
      } else {
         out[j] <- NA
      }
   }
   out[!is.na(out)]
}

my.sample(x = c(1:5,1:4), thresh = 2)
# [1] 1 3 5 1 3
于 2012-11-21T02:00:40.143 回答
1

您可以使用一些递归来执行此操作而无需循环:

vsearch = function(v, x, fun=NULL) {
  # v: input vector
  # x: threshold level

  if (!length(v) > 0) return(NULL)

  y = v-rep(v[1], times=length(v))
  if (!is.null(fun)) y = fun(y)

  i = which(y >= x)

  if (!length(i) > 0) return(NULL)
  i = i[1]

  return(c(v[i], vsearch(v[-(1:(i-1))], x, fun=fun)))
}

使用上面的矢量:

> vsearch(c(1,2,3,4,5,1,2,3,4), 2, abs)
[1] 3 5 1 3
于 2012-11-21T08:22:33.513 回答