N维数组中边距最快的总和:apply(X,MARGIN = c(1,2),sum)

时间:2017-10-10 18:48:44

标签: r rcpp

我有一个4维数组,我需要计算其两个维度的总和。我发现apply的速度非常慢。

我尝试了compiler库,但速度几乎没有提高:

library(compiler)

X <- array(2, dim=c(1000,20,10,125))

suma <- function(X){
  apply(X, MARGIN=c(1,2), sum)
}

suma.cmp <- cmpfun(suma)

benchmark(suma.cmp(X), suma(X), replications = 50)

#       test replications elapsed relative user.self sys.self user.child
#1 suma.cmp(X)           50  24.616    1.000    24.164    0.424          0
#2     suma(X)           50  24.892    1.011    24.440    0.416          0

我会尝试一下Rcpp,但就我所知,RcppArmadillo没有4维数组。

如何尽可能快地进行此计算(apply(X, MARGIN=c(1,2), sum))?

1 个答案:

答案 0 :(得分:5)

rowSums的速度提高了约15倍。它很快转到C,所以我认为很难改进它。

microbenchmark(
  apply = suma(X),
  rowsum = rowSums(X, dims = 2),
  times = 10
)
# Unit: milliseconds
#    expr       min        lq      mean    median        uq       max neval cld
#   apply 692.14893 818.67450 828.66410 829.47926 874.23754 885.36019    10   b
#  rowsum  48.39865  49.85822  51.37486  51.09379  52.04339  56.29224    10  a 

identical(rowSums(X, dims = 2), suma(X))
# [1] TRUE