2016-02-03 63 views
1

想象一下你有一個150×5的矩陣。每個元素包含一個從0到20的隨機整數。讓我的R代碼運行得更快(嵌套循環)

現在認爲矩陣的每一列都是獨立的;我需要遍歷所有5列的所有可能的組合,這產生了150^5 = 75937500000個組合。

重要的是我只運行一次每一個組合。我運行組合的順序並不重要。

我試着用while循環做這個。見下面的代碼。

要運行此循環,根據我的計算,我的筆記本電腦需要54小時。

問題

  • 什麼辦法能讓我的代碼運行速度更快我的筆記本電腦? (bootstrapping?)

  • 如果沒有,是否有任何可以訪問的Web R服務器,以顯着更快的速度運行我的代碼?

  • 如果不是,它會使其他語言運行速度有什麼不同嗎? (Python)的

    while(counter1 <= 150) 
    { 
        while(counter2 <= 150) 
        { 
        while(counter3 <= 150) 
        { 
         while(counter4 <= 150) 
         { 
         while(counter5 <= 150) 
         { 
         #Other operations that take additional time# 
         result<-c(
         giant_matrix[counter1,1], 
         giant_matrix[counter2,2], 
         giant_matrix[counter3,3], 
         giant_matrix[counter4,4], 
         giant_matrix[counter5,5]) 
    
         counter5=counter5+1 
        } 
        counter5=1 
        counter4=counter4+1 
        } 
        counter4=1 
        counter3=counter3+1 
    } 
    counter3=1 
    counter2=counter2+1 
    } 
    counter2=1 
    counter1=counter1+1 
    } 
    
+0

可以嘗試'expand.grid(M [1],米[,2],m [,3],m [,4],m [,5])'其中m是所討論的矩陣。你的機器是否有適合這個大對象的內存? – Gopala

+0

您是否真的需要將所有組合同時存儲在內存中?這將需要'(75,937,500,000組合)*(5 int /組合)*(4字節/ int)= 1,518,750,000,000字節= 1.51875 TB的內存。我不知道任何帶有那麼多RAM的筆記本電腦。 – bgoldst

+0

你真的需要運行150行的所有組合嗎?正如你所提到的,矩陣內的數字是從0到20,所以會有21^5個獨特的數據組合。例如,如果矩陣以行'[1] 10 11 5 17 3'和'[2] 1 7 14 20 3'索引組合'c(1,1,1,1,1)'和'c(1 ,1,1,1,2)'將給出相同的結果載體 – inscaven

回答

0

下面是100種元素的20×5矩陣中的上述溶液中。它導致3200000×5大小的數據幀:上述DF的

m <- matrix(sample(1:20, 100, replace = TRUE), nrow = 20) 
df <- expand.grid(m[, 1], m[, 2], m[, 3], m[, 4], m[, 5]) 

實施例輸出(頭):

head(df) 
    Var1 Var2 Var3 Var4 Var5 
1 10 19 13 4 7 
2 19 19 13 4 7 
3 3 19 13 4 7 
4 5 19 13 4 7 
5 11 19 13 4 7 
6 8 19 13 4 7 

nrow(df) 
[1] 3200000 

dim(df) 
[1] 3200000  5