使用另一个向量作为R中的输入,计算矩阵的每个元素的函数

时间:2016-11-20 20:10:58

标签: r loops matrix

我想通过避免以下代码的循环来计算变量fn_xFn_x

y <- seq(0,2,0.01)
z <- sort(rexp(100,1))
U <- round(runif(100), 0)
myfun <- function(x) 0.75 * (1-x^2) * (abs(x)<1) 

fn_x <- matrix(0, length(y), 1)
Fn_x <- matrix(0, length(y), 1)
for(j in 1:length(y)){
  fn_x[j] <- (1/(100*2)) * sum(myfun((y[j]-z)/2))
  Fn_x[j] <- (1/100)*sum(I(z <=y[j] & U==1))
  }

我的函数使用两个不同维度的不同矩阵来计算每个元素,因此函数apply在这种情况下不起作用。是否可以在不使用任何包的情况下解决此问题?

1 个答案:

答案 0 :(得分:0)

由于您在执行循环之前已经预先分配了向量,因此您需要进行大量加速计算所需的繁重工作。此时,data.table或使用例如C ++的纯实现。 Rcpp包会提高速度。

library(microbenchmark)

microbenchmark(
  original = {
    fn_x <- matrix(NA, length(y), 1)
    Fn_x <- matrix(NA, length(y), 1)
    for(j in 1:length(y)){
      fn_x[j] <- (1/(100*2)) * sum(myfun((y[j]-z)/2))
      Fn_x[j] <- (1/100)*sum(I(z <=y[j] & U==1))
    }
  },
  new =  {
    fn_x2 <- sapply(y, FUN = function(x, z) {
      (1/(100*2)) * sum(myfun((x-z)/2))
    }, z = z)

    Fn_x2 <- sapply(y, FUN = function(x, z, U) {
      (1/100) * sum(I(z <= x & U == 1))
    }, z = z, U = U)
  }
)

Unit: milliseconds
     expr      min        lq     mean    median       uq      max
 original 9.550934 10.407091 12.13302 10.895803 11.95638 22.87758
      new 8.734813  9.126127 11.18128  9.264137 10.12684 87.68265