【发布时间】:2019-02-09 12:28:37
【问题描述】:
我最近创建了这段代码,我正在为我的 for 循环的运行时间而苦苦挣扎。如果我尝试运行此代码,R 似乎需要永远,我不确定错误在哪里:
Graph <- rbind(c(0,0.8,0,0.2,0.1),
c(0,0,0.7,0.6,0.1),
c(0,0,0,0,0.9),
c(0,0,0,0,0.2),
c(0,0,0,0,0))
AmountNodes<-5
Method<-"unweighted"
InfectedNodes<-c(1)
## Function Amount Excluded
SIR_algorithm<-function(Graph, AmountNodes, Method){
ResultMatrix <- rep(0, AmountNodes)
as.data.frame(ResultMatrix)
if (strcmp(Method,"unweighted")){
Graph <- sign(Graph)}
for (i in 1:AmountNodes){
InfectedNodes <- rep(AmountNodes, 0)
ExcludedNodes <- rep(AmountNodes, 0)
InfectedNodes <-c(1)} # Initial Infection, k=Columns, j=Rows
while(sum(InfectedNodes) > 0){
InfectedNodes_Reflection <- InfectedNodes
for (j in 1:nrow(Graph)){
if (Graph[j] == 1){
for (k in 1:ncol(Graph)){
if ((Graph[k,j] > 0 && (InfectedNodes[k][1]) == 0 && (ExcludedNodes[k][1]) == 0)){
RandomValue <- runif(1, max=1, min=0)
if (RandomValue < (Graph[k,j])){
InfectedNodes_Reflection[k] <- k == 1
} #End If-Function
} #End If-Function
} #End For-Function k
} #End If-Function
}} #End For-Function j
for (j in 1:AmountNodes){
if (InfectedNodes[j] == 1){
InfectedNodes[j] <- c(0)
InfectedNodes_Reflection[j] <- c(0)
ExcludedNodes[j] <- c(1)}} #End If-Function and for-function
InfectedNodes <- InfectedNodes_Reflection
ResultMatrix[i] <- ExcludedNodes
length(ResultMatrix) #check length for ResultMatrix
length(ExcludedNodes) #check length for ExcludedNodes
} #End While-Function
#End For-Function i
AmountExcluded <- sum(ResultMatrix)/AmountNodes
#Damage Values<- ResultMatrix * Damage Potential
} #End Function_total
SIR_algorithm(Graph=Graph,AmountNodes=5,Method="unweighted")
有人可以帮帮我吗?
【问题讨论】:
-
错误是您正在用 C 风格编写 R 代码。如果你利用它的矢量化,R 就会发光。
-
(a) 你能用文字描述你的代码在做什么吗?在没有上下文的情况下调试“代码”非常困难。像
#End if function这样的评论实际上并不是很有帮助,因为它们解释了代码中不言自明的东西,而像#Random value determines if cell becomes infected这样的 cmets 可以通过解释代码的目标来提供帮助...... -
(b) 您是如何尝试隔离问题的?您是否尝试过在循环计数器中添加
printstatements,以便您知道它有多远?您是否尝试过使用较小的输入?您的while条件是while(sum(InfectedNodes) > 0),您是否有理由认为您的输入永远不会如此?您是否尝试过将其调整为“更容易”满足的条件,看看是否取得了进展?您是否尝试过一次一行地遍历循环?你能判断问题是在for(j in 1:nrow(Graph))2nd-level 循环还是for(j in 1:AmountNodes)2nd-level 循环?... -
你能提供一个可重现的例子吗?请指定所需的软件包。另外,我尝试按原样运行该示例,并且该函数在您的评论之前终止
#End Function_total -
回到我之前的评论:你注意到有两个
}括号,当函数 j 应该结束时?
标签: r performance for-loop time runtime