【问题标题】:Endless run time for-loop in RR中无尽的运行时间for循环
【发布时间】: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) &gt; 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


【解决方案1】:

问题出在以下几行:

...
while(sum(InfectedNodes) > 0){
  print(sum(InfectedNodes))
  InfectedNodes_Reflection <- InfectedNodes
...

sum(InfectedNodes) 是常数,等于1。所以循环是无限的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2023-03-16
    • 2018-11-13
    • 2016-04-15
    • 1970-01-01
    • 2016-11-14
    相关资源
    最近更新 更多