从n,k维的矩阵数组中减去n,k维的矩阵

New*_*e_R 6 arrays r matrix apply

如果我有阵列A.

A <- array(0, c(4, 3, 5))
for(i in 1:5) {
  set.seed(i)
  A[, , i] <- matrix(rnorm(12), 4, 3)
}
Run Code Online (Sandbox Code Playgroud)

如果我有矩阵B

set.seed(6)
B <- matrix(rnorm(12), 4, 3)
Run Code Online (Sandbox Code Playgroud)

从数组A的每个矩阵中减去B的代码是:

d<-array(0, c(4,3,5))
for(i in 1:5){
  d[,,i]<-A[,,i]-B
}
Run Code Online (Sandbox Code Playgroud)

但是,使用"apply"系列函数执行相同计算的代码是什么?

Mat*_*rde 8

sweep是为了什么.

sweep(A, 1:2, B)
Run Code Online (Sandbox Code Playgroud)


Hon*_*Ooi 6

也许不是很直观:

A[] <- apply(A, 3, `-`, B)
Run Code Online (Sandbox Code Playgroud)

  • 它意味着在括号内分配"A"的元素.您可能还记得,在建立索引时,缺少的维度意味着"选择该维度中的所有元素",例如`mat [1,]`表示"选择矩阵`mat`的第1行和所有列".在进行单维索引时,这种约定也成立,因此`[]`表示"选择所有元素".它在这里做的是它分配到'A` _,同时保持其尺寸完整_.这是必要的,因为`apply`本身将返回一个二维结构,而我们想要一个三维结果. (2认同)