You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:32:55