【发布时间】: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>1e-8)) { pOld <- p p <- t(P) %*% p for (i in 1:n) { r[i] <- abs(p[i]-pOld[i])/p[i] } k<- k+1 } -
这是对的吗:在while循环的每一轮中,您都在初始化对象
r? -
而不是循环
v <- abs(p - pOld) / p; r <- ifelse(v<=1e-8, v, r)请将您的矩阵P放入您的问题中! -
现在可以使用了,谢谢!!
标签: r vector while-loop