【问题标题】:Asking the code to stop when all values in a vector are less than 10^-8当向量中的所有值都小于 10^-8 时要求代码停止
【发布时间】:2019-05-09 05:46:15
【问题描述】:

我对 R 编程非常陌生,我被分配了以下任务: 我必须定义矩阵 p (8 x 1),它在每次迭代中通过将它乘以矩阵 P (8 x 8) 的转置来更新。然后我需要计算每个条目的相对变化(并创建具有差异的矩阵 r (8 x 1)):

r[i] = ( | p[i] - pOld[i] | ) / p[i]

其中 pOld 是前一个 p

并在所有 r[i] 小于或等于 10^-8 时终止循环。我写了以下代码,但它不会收敛。你能指出我的错误吗? 这是我的代码:

p <- as.matrix(rep(1/8,8)) #creating initial matrix p           
k <- 1
r <- as.matrix(rep(1,8)) 

while (all(r > 1e-8))  {

        pOld <- p
        p <- t(P) %*% p
        r <- as.matrix(rep(1,8))        #creating empty vector r

        for (i in 1:8) {
                    value <- abs(p[i]-pOld[i])/p[i] 
                    ifelse(value<=1e-8, r[i] <- value, next)
        }   
        k <- k+1
}

P如下:

        p1      p2      p3      p4      p5      p6      p7      p8
[1,] 0.01875 0.86875 0.01875 0.01875 0.01875 0.01875 0.01875 0.01875
[2,] 0.44375 0.01875 0.01875 0.01875 0.01875 0.01875 0.44375 0.01875
[3,] 0.01875 0.44375 0.01875 0.44375 0.01875 0.01875 0.01875 0.01875
[4,] 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500
[5,] 0.01875 0.01875 0.01875 0.44375 0.01875 0.44375 0.01875 0.01875
[6,] 0.01875 0.23125 0.23125 0.23125 0.23125 0.01875 0.01875 0.01875
[7,] 0.01875 0.01875 0.01875 0.01875 0.01875 0.44375 0.01875 0.44375
[8,] 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500 0.12500

【问题讨论】:

  • Jogo,是的,你是对的,对于外循环,我需要使用 any () 而不是 all()。我想知道是否可以稍微更改我的代码以避免重置 r:
  • while (any(r&gt;1e-8)) { pOld &lt;- p p &lt;- t(P) %*% p for (i in 1:n) { r[i] &lt;- abs(p[i]-pOld[i])/p[i] } k&lt;- k+1 }
  • 这是对的吗:在while循环的每一轮中,您都在初始化对象r
  • 而不是循环 v &lt;- abs(p - pOld) / p; r &lt;- ifelse(v&lt;=1e-8, v, r) 请将您的矩阵 P 放入您的问题中!
  • 现在可以使用了,谢谢!!

标签: r vector while-loop


【解决方案1】:

最终完整的代码可能是:

P <- matrix(c( 
0.01875, 0.86875, 0.01875, 0.01875, 0.01875, 0.01875, 0.01875, 0.01875,
0.44375, 0.01875, 0.01875, 0.01875, 0.01875, 0.01875, 0.44375, 0.01875,
0.01875, 0.44375, 0.01875, 0.44375, 0.01875, 0.01875, 0.01875, 0.01875,
0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500,
0.01875, 0.01875, 0.01875, 0.44375, 0.01875, 0.44375, 0.01875, 0.01875,
0.01875, 0.23125, 0.23125, 0.23125, 0.23125, 0.01875, 0.01875, 0.01875,
0.01875, 0.01875, 0.01875, 0.01875, 0.01875, 0.44375, 0.01875, 0.44375,
0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500, 0.12500), 8, 8, byrow=TRUE)

p <- rep(1/8, 8) #creating initial matrix p           
k <- 1

while (any(r > 1e-8)) { #  
  pOld <- p
  p <- c(crossprod(P, p)) ## t(P) %*% p
  r <- rep(1, length(p))

  v <- abs(p-pOld) / p
  r <- ifelse(v<=1e-8, v, r)
  k <- k+1
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    相关资源
    最近更新 更多