有效计算 R 中两个 3D 数组的叉积之和
Efficiently computing sum of cross product for two 3D arrays in R
例如,对于 R 中的两个 3D 数组,
N <- 1000
x <- rnorm(N*3*3); dim(x) <- c(N,3,3)
y <- rnorm(N*3*3); dim(y) <- c(N,3,3)
我可以通过循环做以下叉积:
gg <- 0
for (n in 1:dim(x)[1]){
gg <- gg + t(x[n,,]) %*% y[n,,]
}
我的问题是,对于非常大的 N
,我们是否可以更有效地做到这一点(例如,通过矢量化或 rcpp
)而不是使用循环?
如果你用数学方法重写你的问题,你可以证明它等价于:
dim(x) <- c(3 * N, 3)
dim(y) <- c(3 * N, 3)
gg2 <- crossprod(x, y)
应该很快,应该不会复制。
例如,对于 R 中的两个 3D 数组,
N <- 1000
x <- rnorm(N*3*3); dim(x) <- c(N,3,3)
y <- rnorm(N*3*3); dim(y) <- c(N,3,3)
我可以通过循环做以下叉积:
gg <- 0
for (n in 1:dim(x)[1]){
gg <- gg + t(x[n,,]) %*% y[n,,]
}
我的问题是,对于非常大的 N
,我们是否可以更有效地做到这一点(例如,通过矢量化或 rcpp
)而不是使用循环?
如果你用数学方法重写你的问题,你可以证明它等价于:
dim(x) <- c(3 * N, 3)
dim(y) <- c(3 * N, 3)
gg2 <- crossprod(x, y)
应该很快,应该不会复制。