2016-06-16 51 views
0

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

我试图找出是多么大的“n”必须是P中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假设给我们假或真?

感谢您阅读我的问题/ 困惑的学生头痛很大。

+0

修改标题,表示您的产品名称 – dbmitch

+0

的'%^%'在包'expm'功能更快。 –

回答

0
从格式化

除此之外,我做了两个修改了代码:

  1. 你忘了使用mpow功能和使用trunc(P * 10^d)代替。
  2. 我将==替换为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