【问题标题】:Subtract matrix of n,k dimensions from array of matrices of n,k dimensions从 n,k 维矩阵数组中减去 n,k 维矩阵
【发布时间】:2013-06-23 22:26:41
【问题描述】:

如果我有一个数组 A

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

如果我有矩阵 B

set.seed(6)
B <- matrix(rnorm(12), 4, 3)

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

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

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

【问题讨论】:

    标签: arrays r matrix apply


    【解决方案1】:

    也许不是很直观:

    A[] <- apply(A, 3, `-`, B)
    

    【讨论】:

    • Tnx 提供宝贵的回复。请告诉我,在保留 A[] 的同时,我们实际上对 R 说了什么?
    • 表示在括号内赋值给A的元素。您可能还记得在索引时,缺少的维度意味着“选择该维度中的所有元素”,例如mat[1, ] 意味着“选择矩阵mat 的第一行和所有列”。此约定在进行单维索引时也适用,因此[] 表示“选择所有元素”。它在这里所做的是它分配给A 同时保持其尺寸不变。这是必要的,因为apply 本身将返回一个二维结构,而我们想要一个 3 维结果。
    【解决方案2】:

    这就是sweep 的用途。

    sweep(A, 1:2, B)
    

    【讨论】:

    • 又一个强大的命令,名字完全不直观(对非统计学家来说)......我爱 R!名称与“应用”不同。
    【解决方案3】:

    因为你在最后一个数组维度上循环,你可以简单地做:

    d <- A - as.vector(B)
    

    而且它会更快。这与从矩阵中减去向量时的想法相同:向量被回收,因此它被减去到每一列。

    【讨论】:

    • 我需要遍历数组的整个维度。也许我引入了一些误解,因为在第一篇文章中我写了 set.seed(5) 只为数组的最后一维给出数值差异。但是,我编辑了帖子(例如 set.seed(i)),并且可能使我打算做的事情更加直观和清晰。不过,非常感谢您的回复!
    • @Newbie_R:我认为您没有意识到我的答案与您的答案相同。
    • 你是对的!我得到了不同的结果,因为我用错误的矩阵 B 检查了你的建议......我的错。 Tnx
    猜你喜欢
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    相关资源
    最近更新 更多