如果k
在每次迭代增長和delta
不會改變我建議如下:
d <- -delta:delta
for (...) {
# ...
vnew <- v[-(rep(k, each=length(d)) + d),]
# ...
}
對於示例:
d <- -5:5
k <- c(10, 40)
rep(k, each=length(d)) + d
# [1] 5 6 7 8 9 10 11 12 13 14 15 35 36 37 38 39 40 41 42 43 44 45
編輯:這兩種解決方案的一個基準:
library("rbenchmark")
idx1 <- function(k, delta) {
d <- -delta:delta
lapply(seq_along(k), function(i) {
rep(k[1:i], each=length(d)) + d
})
}
idx2 <- function(k, delta) {
lapply(seq_along(k), function(i) {
c(sapply(1:i, function(ii) {
(k[ii]-delta):(k[ii]+delta)
}))
})
}
set.seed(1)
k <- sample(1e3, 1e2)
delta <- 5
all.equal(idx1(k, delta), idx2(k, delta))
# [1] TRUE
benchmark(idx1(k, delta), idx2(k, delta), order="relative", replications=100)
# test replications elapsed relative user.self sys.self user.child sys.child
# 1 idx1(k, delta) 100 0.174 1.000 0.172 0 0 0
# 2 idx2(k, delta) 100 1.579 9.075 1.576 0 0 0
'-c(sapply(SEQ(K),函數(I)(K [I] -delta):(k [i] + delta)))' – 2014-11-22 21:47:58
在k中總是有2個元素? – 2014-11-22 21:49:37
在每次迭代中'delta'是否改變?如果不是的話,你可以使用類似於:'d < - -delta:delta;對於(...){... vnew < - v [ - (rep(k,each = length(d))+ d)] ...}' – sgibb 2014-11-22 21:52:00