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

Fastest sum over margins in N-dimensional array: apply(X, MARGIN=c(1,2), sum)

我有一个 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)) 尽可能快?

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