矩阵中的所有行都相等

时间:2016-06-16 15:50:06

标签: r

我试图让命令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?

感谢您阅读我的问题/ 困惑的学生头疼得厉害。

1 个答案:

答案 0 :(得分:0)

除格式化外,我对您的代码进行了两处更改:

  1. 您忘记使用mpow功能,而是使用了trunc(P * 10^d)
  2. 我将==替换为all.equal,这允许一些数字不精确。
  3. 在这些情况下,使用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
    
相关问题