我正在尝试找到一种更有效的方法来在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"))
谢谢!
答案 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 <- 200
和m <- 300
进行了一些计时,这是最快的3.1秒,而我最初的解决方案是4.7秒,问题中的是17.4秒。