有没有有效的方法来计算没有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])
答案 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)可能会尽可能快。