R中不同维度数组相减的最优实现:三种方法性能对比
高效实现高维数组与低维数组的逐元素减法
假设我们有两个数组:A的维度是[3,4,5],B的维度是[4,5],需要生成维度同样为[3,4,5]的数组C,使得对于所有i,j,k,都有C[i,j,k] = A[i,j,k] - B[j,k]。
为了找到性能最优的实现方式,我用microbenchmark包对三种不同的方案做了量化测试,测试结果如下:
Unit: microseconds expr min lq mean median uq max neval f1 28.4 33.00 37.329 34.75 37.00 213.5 100 f2 32.5 37.65 40.069 38.95 40.55 103.0 100 f3 33.8 40.25 42.397 41.65 43.30 64.5 100
从测试结果可以明显看到,f1的运行速度是最快的,所以我最终选择了@user10488504提供的代码作为解决方案。在此特别感谢@user10488504、@Stéphane Laurent和@Lyngbakr三位的贡献,这个方案会被我应用到自己的包中,帮了我大忙!
以下是本次测试用到的所有代码:
三种实现函数
# 方案1:f1(最优) f1 <- function(){ A <- array(1:100, c(3,4,5)) B <- array(1:80, c(4,5)) C <- array(aperm(sapply(1:dim(A)[1], function(i) A[i,,] - B)), dim(A)) } # 方案2:f2 f2<-function(){ A <- array(1:100, c(3,4,5)) B <- array(1:80, c(4,5)) sweep(A, c(2,3), B) } # 方案3:f3 f3 <- function(){ A <- array(1:100, c(3,4,5)) B <- array(1:80, c(4,5)) # Perform calculation res <- array(t(apply(A, MARGIN = 1, function(x)x-B)), c(3,4,5)) }
性能测试代码
library(microbenchmark) library(ggplot2) mb <- microbenchmark( f1 = f1(), f2 = f2(), f3 = f3() ) # 查看测试结果 mb # 可视化测试结果(可选) autoplot(mb)
内容的提问来源于stack exchange,提问作者Camford Oxbridge
相关产品推荐
相关产品推荐

