Эффективное вычисление суммы кросс-произведения для двух 3D-массивов в R - PullRequest
4 голосов
/ 20 марта 2019

Для двух 3D-массивов в R, например,

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,,]
}

Мой вопрос: можем ли мы сделать это более эффективно?(например, путем векторизации или rcpp) для очень больших N вместо использования цикла?

1 Ответ

5 голосов
/ 20 марта 2019

Если вы переписываете свою задачу математически, вы можете показать, что она эквивалентна:

dim(x) <- c(3 * N, 3)
dim(y) <- c(3 * N, 3)
gg2 <- crossprod(x, y)

, которая должна быть очень быстрой и не должна делать никаких копий.

...