我试图让命令rows_equal工作,但没有设法这样做。
有问题的矩阵是:
P <- matrix(c(0, 0, 0, 0.5, 0, 0.5, 0.1, 0.1, 0, 0.4, 0, 0.4, 0, 0.2, 0.2, 0.3, 0, 0.3, 0, 0, 0.3, 0.5, 0, 0.2, 0, 0, 0, 0.4, 0.6, 0, 0, 0, 0, 0, 0.4, 0.6), nrow = 6, ncol = 6, byrow = TRUE)
我想弄清楚的是,在P ^ n中必须有多大的“n”才能使矩阵中的所有行相等。
mpow <- function(P, n) {if (n == 0) {return(diag(nrow(P)))} else if
(n == 1) {return(P)} else {
return(P %*% mpow(P, n - 1))} }
rows_equal <- function(P, d = 4) {P_new <- trunc(P * 10^d)
for (k in 2:nrow(P_new)) {if
(!all(P_new[1, ] == P_new[k, ])) {
return(FALSE)} }
return(TRUE) }
这是我进入Rstudio的原因,但是,我看不出我做错了什么。是不是命令rows_equal假设给我们False或True?
感谢您阅读我的问题/ 困惑的学生头疼得厉害。
答案 0 :(得分:0)
除格式化外,我对您的代码进行了两处更改:
mpow
功能,而是使用了trunc(P * 10^d)
。==
替换为all.equal
,这允许一些数字不精确。在这些情况下,使用all.equal
来比较数值通常优于==
。
rows_equal <- function(P, d = 4) {
P_new <- mpow(P, d)
for (k in 2:nrow(P_new)) {
if ((all.equal(P_new[1, ], P_new[k, ])) != TRUE) {
return(FALSE)
}}
return(TRUE)
}
此输出
> rows_equal(P, 10)
[1] FALSE
> rows_equal(P, 50)
[1] TRUE