![](/img/trans.png)
[英]Summing the difference of all values of one vector that are less than the values in another
[英]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.