两个3D阵列和2D矩阵的乘积

时间:2019-08-04 10:23:48

标签: arrays r

我正在尝试找到一种更有效的方法来在R中编写以下矩阵: 假设A和C是尺寸为(n,n,m)的两个3D数组,而B是尺寸为(m,m)的矩阵,则M为(n,n)矩阵,使得:

M_ij = SUM_kl A_ijk * B_kl * C_ijl
for (i in seq(n)) {
  for (j in seq(n)) {
    M[i, j] <- A[i,j,] %*% B %*% C[i,j,]
    }
  }

可以使用TensorA包使用i和j作为平行维度来编写此代码,但我宁愿使用基本R对象。

einstein.tensor(A %e% log(B), C, by = c("i", "j"))

谢谢!

1 个答案:

答案 0 :(得分:0)

我不知道这样做是否会更快,但可以避免一级循环:

for (i in seq(n))
  M[i,] <- diag(A[i,,] %*% B %*% t(C[i,,]))

在此示例中,它给出的答案与您的答案相同:

n <- 2
m <- 3
A <- array(1:(n^2*m), c(n, n, m))
C <- A + 1
B <- matrix(1:(m^2), m, m)

M <- matrix(NA, n, n)
for (i in seq(n))
  M[i,] <- diag(A[i,,] %*% B %*% t(C[i,,]))
M
#      [,1] [,2]
# [1,] 1854 3216
# [2,] 2490 4032

编辑后添加:以下是基于https://stackoverflow.com/a/42569902/2554330的版本:

for (i in seq(n))
  M[i,] <- rowSums((A[i,,] %*% B) * C[i,,])

我对n <- 200m <- 300进行了一些计时,这是最快的3.1秒,而我最初的解决方案是4.7秒,问题中的是17.4秒。