2016-06-16 49 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