讓我們假設我有一個矢量R:計算兩個矢量
r <- rnorm(4)
和尺寸20000 * 200的例如基質W
:
W <- matrix(rnorm(20000*200),20000,200)
我想要計算尺寸爲5000 * 200的新矩陣M
,使得m11 <- r%*%W[1:4,1]
,m21 <- r%*%W[5:8,1]
,m12 <- r%*%W[1:4,2]
等(即,將行4乘4並計算產品)。
這樣做的最佳(速度,內存)方式是什麼?
在此先感謝。
讓我們假設我有一個矢量R:計算兩個矢量
r <- rnorm(4)
和尺寸20000 * 200的例如基質W
:
W <- matrix(rnorm(20000*200),20000,200)
我想要計算尺寸爲5000 * 200的新矩陣M
,使得m11 <- r%*%W[1:4,1]
,m21 <- r%*%W[5:8,1]
,m12 <- r%*%W[1:4,2]
等(即,將行4乘4並計算產品)。
這樣做的最佳(速度,內存)方式是什麼?
在此先感謝。
這似乎是最快的,我跑:
array(r %*% array(W, c(4, 20000 * 200/4)), c(5000, 200))
我不知道這是在速度上還是內存優化,但可能的簡單方法之一:
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
首先在我腦海裏是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 answer:
M <- apply(array(W,c(4,5000,200)), 3, function(x) r%*%x)
要在較短的dim(再次)上迭代。
您解決方案比我的解決方案快得多。大! – kohske 2010-06-14 14:10:02
尊重:)確實最快。 – Marek 2010-06-14 16:14:56
並使用較少的內存,因爲我檢查 – Marek 2010-06-14 16:21:27
工程很棒!thx – teucer 2010-06-15 07:44:57