计算数组乘法的有效方法

时间:2013-12-17 04:06:29

标签: r

有没有有效的方法来计算没有for语句的2x2矩阵H?

    n=10

    a=array(rnorm(n),c(2,1,n))
    b=array(rnorm(n),c(2,1,n))

    H=matrix(0,2,2)
    for(i in 1:n) H=H+a[,,i] %*% t(b[,,i])

2 个答案:

答案 0 :(得分:3)

  H=matrix(0,2,2)
     for(i in 1:n) H=H+a[,,i] %*% t(b[,,i])
 H
#----------
          [,1]       [,2]
[1,] 10.770929 -0.4245556
[2,] -5.613436 -1.7588095


 H2 <-a[ ,1, ] %*% t(b[ ,1, ])
H2
#------------- 
          [,1]       [,2]
[1,] 10.770929 -0.4245556
[2,] -5.613436 -1.7588095

这取决于所讨论的数组,其中一个维度== 1,并且“[”将删除长度为1的维度,除非您指定drop = FALSE。

答案 1 :(得分:2)

与您计算的内容相同(根据FAQ 7.31问题):

如果第二维真正具有 1级别,则可以使用

  

tcrossprod(矩阵(a,nr = 2),矩阵(b,nr = 2))

,更一般地说,

  

crossprod(基质(aperm(a,c(3,1,2)),nc = 2),基质(aperm(b,c(3,1,2)),nc = 2))

如果您可以创建'a'和'b',那么您不需要aperm(),它仍然会更快。

不同解决方案的相对速度取决于尺寸。如果前两个都很大而最后一个很小,那么像你这样的循环(但使用crossprod)可能会尽可能快。