2016-07-22 51 views
1

我處於一種情況,我需要將陣列乘以沒有已知陣列號和數組維數。例如:動態維數組乘法

demo1 = c(0.45, 0.55) 
demo2 = c(0.1, 0.1, 0.15, 0.15, 0.2, 0.05, 0.15, 0.1) 

myarr <- array(1:n, dim = c(length(demo1), length(demo2))) 

for (p in 1:length(demo1)){ 
    for (q in 1:length(demo2)){ 
     myarr[p,q] <- demo1[p]*demo2[q] 
    } 
} 

當我們知道演示的數量時可以。但我不知道什麼時候不知道演示的數量,仍然需要對其長度乘法的維數進行排列。所以,我可能有一些demo = 3或4或5等等。如何概括上面的for循環裏面的語句。由於我對R很新,因此我會很感激你的快速幫助。提前

+0

感謝大衛糾正錯字.. – skj

+0

當你知道''demo1''或''demo2'我真的不明白'。但只要'demo1''和''demo2''不會變得非常大,您可以重複計算當前的''demo1''和''demo2''。你可能想看看:''demo1%o%demo2'',它利用了R的矢量化,並且比''for''循環快得多(且更短)。 – Phann

+0

感謝Phann的回覆。沒有任何演示可以超過2個。可以有demo3,demo4等等。 – skj

回答

0

非常感謝看一看?outer或簡短%o%倍增您的載體:

myarr <- demo1 %o% demo2 %o% demo3 # %o%... 

當然,你可以做到這一點反覆的情況下,應添加新的載體:

myarr <- demo1 %o% demo2 
myarr <- myarr %o% demo3 
#... 

作爲附加信息:For - 迴路在R中非常緩慢,如果可以使用向量化,則不應使用該回路。

使用量化的,而不是循環產生了大約1000時間優勢:

demo1 <- runif(1000) 
demo2 <- runif(1000) 
system.time({ 
    myarr <- array(1:n, dim = c(length(demo1), length(demo2))) 

    for (p in 1:length(demo1)){ 
    for (q in 1:length(demo2)){ 
     myarr[p,q] <- demo1[p]*demo2[q] 
    } 
    } 
}) 
#round about 6.8s on my system 
system.time(demo1 %o% demo2) 
#round about 0.01s on my system 
+0

作爲* vectorization *的附加信息:這是一篇關於它的內容豐富的文章,其中包含許多其他參考資料:http://www.noamross.net/blog/2014/4/16/vectorization-in-r-- why.html – Phann