簡體   English   中英

當向量中的所有值均小於10 ^ -8時要求代碼停止

[英]Asking the code to stop when all values in a vector are less than 10^-8

我對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

最終,完整的代碼可能是:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM