r语言 - 加速代码.循环求和与核函数



我正在运行下面的代码来计算r的每个值的函数。

对于r的每个元素,该函数计算矩阵乘积的元素之和。在此之前,根据核函数调整M的值。

# (1) set-up with toy data 
r <- seq(0, 10, 1)
bw <- 25 
M <- matrix(data = c(0, 1, 2,
                     1, 0, 1,
                     2, 1, 0), nrow = 3, ncol = 3)
X <- matrix(rep(1, 9), 3, 3)
#
# (2) computation 
res <- c()
# loop, calculationg sum, Epanechnikov kernel 
for(i in seq_along(r)) {
  
  res[i] <- sum(
    
    # Epanechnikov kernel
    ifelse(-bw < (M - r[i]) & (M - r[i]) < bw,
           3 * (1 - ((M - r[i])^2 / bw^2)) / (4*bw),
           0) * X,
    na.rm = TRUE
  )
  
}
# result 
res  

我正在寻找建议,以加快使用基础r。谢谢!

使用outer:

Mr <- outer(c(M), r, "-")
colSums(3*(1 - Mr^2/bw^2)/4/bw*(abs(Mr) < bw)*c(X))
#>  [1] 0.269424 0.269760 0.269232 0.267840 0.265584 0.262464 0.258480 0.253632 0.247920 0.241344 0.233904

我还会注意到,原始的for循环解决方案可以通过在for循环之前预先分配res(例如,res <- numeric(length(r)))来加速。

最新更新