2010-06-14 260 views
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並計算產品)。

這樣做的最佳(速度,內存)方式是什麼?

在此先感謝。

回答

6

這似乎是最快的,我跑:

array(r %*% array(W, c(4, 20000 * 200/4)), c(5000, 200)) 
+0

尊重:)確實最快。 – Marek 2010-06-14 16:14:56

+0

並使用較少的內存,因爲我檢查 – Marek 2010-06-14 16:21:27

+0

工程很棒!thx – teucer 2010-06-15 07:44:57

2

我不知道這是在速度上還是內存優化,但可能的簡單方法之一:

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 
3

首先在我腦海裏是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(再次)上迭代。

+0

您解決方案比我的解決方案快得多。大! – kohske 2010-06-14 14:10:02