Эффективное вычисление суммы перекрестного произведения для двух трехмерных массивов в R

Например, для двух 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 вместо использования цикла?


person user7283235    schedule 20.03.2019    source источник
comment
в этом посте реализовано матричное умножение с использованием Rcpp 37191673/   -  person Ronak Shah    schedule 20.03.2019
comment
Спасибо за комментарий! Я написал rcpp и протестировал цикл, но он в 2 раза медленнее, чем цикл ... Я думаю, что решение F. Privé, приведенное ниже, является самым быстрым согласно моим тестам.   -  person user7283235    schedule 20.03.2019


Ответы (1)


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

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

который должен быть очень быстрым и не должен копировать.

person F. Privé    schedule 20.03.2019
comment
Большое спасибо! Он работает примерно в 12 раз быстрее, чем цикл на моем компьютере! - person user7283235; 20.03.2019