[英]Efficient way to calculate array multiplication
沒有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])
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。
這與您的計算結果相同(最多FAQ 7.31問題):
如果第二維確實只有一個級別,則可以使用
tcrossprod(matrix(a,nr = 2),matrix(b,nr = 2))
更一般地說,
crossprod(矩陣(aperm(a,c(3,1,2)),nc = 2),矩陣(aperm(b,c(3,1,2)),nc = 2))
如果可以創建有序的“ a”和“ b”,從而不需要aperm(),它將更快。
不同解決方案的相對速度取決於尺寸。 如果前兩個都很大而最后一個很小,那么像您這樣的循環(但使用crossprod)可能會盡快。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.