2016-04-14 32 views
0

I olması için:aşağıdaki kodu daha verimli

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 bir matris 80 sütun ve 10000 satır olduğunu, Theta 1000 satır 80 sütun 2500 matrislerin bir listesidir. Amacımız, her 2500 simülasyon için 10000 adet veri tabanı oluşturmaktır. Her data.frame, [[j]] tetanın tüm sırası ile çarpılan bir W (W [i,]) satırının sonucu olacaktır (böylece 80 sütun ve 1000 satırlık bir portföy). biz sadece bu nedenle bir sütun ile 1000 satır) burada

bir data.frame Gördüğünüz gibi bir tekrarlanabilir kod

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]]) 

bu portföyün her satırın toplamını gerek, oldukça ağır ve bilgisayarım böyle bir şeyi gerçekleştiremez.

Daha verimli ve daha az zaman harcatabilmemin bir yolu var mı?

Teşekkür ederim!

+2

all.equal(WBP(),wbp1()) Batanichek

+0

bazı lineer cebir çarpma gibi görünüyor ne kodunuzu kelimeyle açıklar. Matematiksel eşdeğer nedir? – chinsoon12

+0

't (W [i,])' nin kullanımı nedir, çünkü 1, 80 boyutlarında bir matristir ve hatta aktarıldıktan sonra bile aynı boyutlar üretilecek mi? –

cevap

0

kullanabilirsiniz tek lapply

gibi:

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

ya kullanılarak tcrossprod

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

benchamrk

Varyant

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 

sonuç aynı (farklı sadece isimler)

İlgili konular