2013-11-15 30 views
2

我有一段很長的代碼,並試圖通過刪除for循環來加快速度。正如我站在你有多個嵌套循環時,它可以減慢你的代碼。我原來的代碼包含3個循環,運行598,687和44迭代。花了大約15分鐘跑步。我使用此代碼來顯示我正在運行的某些模型的輸出,並等待15分鐘是不可接受的。我無法擺脫其中一個循環。我試圖使用矢量,但它不能正確運行。讓我們看看前10次迭代。使用向量而不是循環在R

#data 
flows=c(-0.088227, 0.73024, 0.39683, 1.1165, 1.0802, 0.22345, 0.78272, 0.91673, 0.53052, 0.13852) 
cols=c(31, 31, 30, 30, 30, 30, 31, 31, 31, 31) 
rows=c(3, 4, 4, 5, 6, 7, 7, 8, 9, 10) 
dataset=matrix(0,33,44) 
for (i in 1:10){dataset[rows[i],cols[i]]<-flows[i]+dataset[rows[i],cols[i]]} 

#And this is my alternative(Not working) 
dataset=matrix(0,33,44) 
NoR=10 
dataset[rows[1:NoR],cols[1:NoR]]<-flows[1:NoR]+dataset[rows[1:NoR],cols[1:NoR]] 

在這裏看到問題。不知何故列顯示相同的行信息。 我在這裏錯過了什麼?爲什麼第二個代碼不能正確運行?

回答

2

對於可能出現的真正潛在問題有些困難,因爲我猜測我們在這裏只看到了一小段代碼。但我想也許你正在尋找像這樣的東西:

flow_mat <- matrix(0,33,34) 
flow_mat[(cols - 1) * 33 + rows] <- flows 

請記住,矩陣只是具有維度屬性的向量。因此,您可以像向量一樣爲它們編制索引,想象索引從「左上角」開始,然後按列迴繞。

+0

+1,你快了幾秒鐘。 – Roland

+0

@Joran哇沒有意識到你可以稱之爲這樣的矩陣。我改變了代碼'flow_mat [(cols - 1)* 33 + rows] < - flows + flow_mat [(cols - 1)* 33 + rows]'有幾個單元格有多個值,他們必須被添加。你說得對,沒有加速代碼。我在考慮發佈我的代碼的其餘部分是否更適合開始一個新的問題? – CCurtis

+0

@CCurtis一個新的問題可能是最好的,但一定要嘗試確定一個緩慢的特定的,自包含的代碼片段。理想情況下,我們應該能夠自己運行它。 – joran