2013-06-26 126 views
6

如果我有一个数组甲减去矩阵,K尺寸从n个的矩阵阵列中,K个维度

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) 

减去B中的代码从阵列A的每个矩阵将是:

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

但是,什么是将执行相同的计算使用函数从“a pply“家庭?

回答

8

这是sweep是。

sweep(A, 1:2, B) 
+0

非常感谢这个信息 –

+0

另一个非常直观的名称(对非统计学家)的另一个强大的命令...我爱R!名称与'apply'不一样。 – smci

6

也许不是很直观:

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

Tnx宝贵的答复。 请告诉我,我们在保留A []的同时对R做了什么? –

+2

这意味着分配到括号内的“A”元素。您可能还记得,索引时,缺少的维度意味着“选择该维度中的所有元素”,例如'mat [1,]'意味着“选择第一行和所有矩阵mat'列”。这个约定在进行单维索引时也适用,因此'[]'表示“选择所有元素”。它在这里做的是在保持其尺寸不变的情况下赋予“A”。这是必要的,因为'apply'本身会返回一个二维结构,而我们想要一个三维结果。 –

+0

很好的解释,非常感谢:) –

4

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

d <- A - as.vector(B) 

,它会快很多。这与当从矩阵中减去矢量时的想法是一样的:矢量被循环使用,所以它被减去每列。

+0

+1这是一个不错的事实 –

+0

我需要遍历整个数组的维度。也许我引入了一些误解,因为在第一篇文章中,我写了set.seed(5),仅给出数组的最后一个维数的差异。但是,我编辑了这篇文章(例如set.seed(i)),并可能使我打算做的更直观清晰。 但是,非常感谢您的回复! –

+0

@Newbie_R:我不认为你会意识到我的答案与你的答案相同。 – flodel