簡體   English   中英

計算數組乘法的有效方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM