R: оптимальный способ вычисления «произведения» двух векторов - PullRequest
4 голосов
/ 14 июня 2010

Давайте предположим, что у меня есть вектор

r <- rnorm(4)

и матрица W размера 20000 * 200, например:

W <- matrix(rnorm(20000*200),20000,200)

Я хочу вычислить новую матрицу M размерности 5000 * 200, такой что m11 <- r%*%W[1:4,1], m21 <- r%*%W[5:8,1], m12 <- r%*%W[1:4,2] и т. Д. (Т.е. группирование строк 4 на 4 и вычисление произведения).

Что является оптимальным (скорость, память) Как это сделать?

Заранее спасибо.

Ответы [ 3 ]

6 голосов
/ 14 июня 2010

Это, кажется, работает быстрее всего для меня:

array(r %*% array(W, c(4, 20000 * 200 / 4)), c(5000, 200))
3 голосов
/ 14 июня 2010

Сначала у меня на уме apply более короткое затемнение:

M <- apply(W, 2, function(x) r%*%matrix(x,4,5000))

m11 <- r%*%W[1:4,1]
m21 <- r%*%W[5:8,1]
m12 <- r%*%W[1:4,2]

m11 - M[1,1]
#      [,1]
# [1,]    0
m21 - M[2,1]
#      [,1]
# [1,]    0
m12 - M[1,2]

#      [,1]
# [1,]    0

Профилированное kohske ответ :

M <- apply(array(W,c(4,5000,200)), 3, function(x) r%*%x)

для повторения по более короткому затемнению).

2 голосов
/ 14 июня 2010

Я не знаю, является ли это оптимальным по скорости или памяти, но, вероятно, один из простых способов:

m<-apply(array(W,c(4,5000,200)),c(2,3),"%*%",r)


> m[1,1:10]==r%*%W[1:4,1:10]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
> m[2,1:10]==r%*%W[5:8,1:10]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE  TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...