2016-04-14 47 views
0

我不得不以下代碼:中的R變換的碼,使之更有效地

WBP2=lapply(1:2500,function(j){as.data.frame(lapply(1:10000,function(i) 
    {rowSums(data.frame((mapply(`*`,Theta[[j]],t(W[i,]),SIMPLIFY=FALSE))))}))}) 

W爲矩陣80倍的列和10000行,西塔是1000行和80列2500點的矩陣的列表。我們的目標是爲每2500次模擬創建10000個數據幀。每個data.frame將是一行W(W [i,])乘以theta [[j]]的所有行(因此是80列和1000行的組合)的結果。我們只需要這個投資組合的每一行的總和,因此一列和1000行)

這裏的data.frame是一個可重複的代碼

W=matrix((1:80), nrow =10, ncol=4) 

theta= lapply(1:5,function(j){matrix((41:60),nrow=5,ncol=4)}) 

WBP=lapply(1:5,function(j){as.data.frame(lapply(1:10,function(i) 
{rowSums(data.frame(as.matrix(theta[[j]])%*%as.numeric(t(W[i,]))))}))}) 

View(WBP[[1]]) 

正如你可以看到,這是相當沉重,我的電腦不能實現這樣的事情。

有沒有辦法讓我的效率更高,更省時?

謝謝!!!

+2

的話你的代碼做 – Batanichek

+0

看起來有些線性代數乘法解釋。什麼是數學等價物? – chinsoon12

+0

't(W [i,])'的用法是什麼,因爲它是維度爲1,80的矩陣,甚至在轉置它之後,將生成具有相同維度的結果? –

回答

0

只能使用一個lapply

,如:

wbp1=function()lapply(1:5,function(j){as.data.frame(as.matrix(theta[[j]])%*%as.matrix(t(W)))}) 

或使用tcrossprod

wbp2=function()lapply(1:5,function(j){as.data.frame(tcrossprod(as.matrix(theta[[1]]),as.matrix(W)))}) 

benchamrk

您變種

WBP=function()lapply(1:5,function(j){as.data.frame(lapply(1:10,function(i) 
    {rowSums(data.frame(as.matrix(theta[[j]])%*%as.numeric(t(W[i,]))))}))}) 




microbenchmark(WBP(),wbp1(),wbp2()) 

Unit: microseconds 
    expr  min   lq  mean median  uq  max neval cld 
    WBP() 21965.723 22239.5595 24013.0301 22598.766 23971.683 80285.027 100 b 
wbp1() 613.607 623.5590 672.4546 645.174 665.855 2182.920 100 a 
wbp2() 513.153 523.5715 568.0328 542.699 558.715 1814.073 100 a 

結果相同(只有名稱不同)all.equal(WBP(),wbp1())