2017-10-04 78 views
0

我試圖通過創建第一部分來避免重複一些簡單的計算。但我想知道爲什麼我沒有獲得與第二部分(第二部分給出正確答案)相同的結果?在R中重複一個簡單的矩陣算法?

第一部分:

a = matrix(c(8,11,2, 6,8,4, 4,5,6, 2,8,8), nrow = 3) 
nr = nrow(a) 
nc = ncol(a) 
mc = colMeans(a) 
mr = rowMeans(a) 
gr = mean(a) 

(m = matrix(c(a[rep(1:nr, nr), rep(1:nc, each = nc)] - mr[rep(1:nr, nr)] - 
mc[rep(1:nc, each = nc)] + gr), nrow = nr, ncol = nc))  ## This is NOT correct answer !! 

第二部分:

a11 <- a[1, 1] - mr[1] - mc[1] + gr 
a21 <- a[2, 1] - mr[2] - mc[1] + gr 
a31 <- a[3, 1] - mr[3] - mc[1] + gr 
a12 <- a[1, 2] - mr[1] - mc[2] + gr 
a22 <- a[2, 2] - mr[2] - mc[2] + gr 
a32 <- a[3, 2] - mr[3] - mc[2] + gr 
a13 <- a[1, 3] - mr[1] - mc[3] + gr 
a23 <- a[2, 3] - mr[2] - mc[3] + gr 
a33 <- a[3, 3] - mr[3] - mc[3] + gr 
a14 <- a[1, 4] - mr[1] - mc[4] + gr 
a24 <- a[2, 4] - mr[2] - mc[4] + gr 
a34 <- a[3, 4] - mr[3] - mc[4] + gr 

g = paste0("a", rep(1:3, 3), rep(1:4, each = 3)) 
(m = matrix(c(mget(g)), nr = 3, ncol = 4))    ## This is the correct answer !! 

回答

1

您可以使用outer來計算的差異:

myMat <- a - outer(mr, mc, "+") + gr 
myMat 

    [,1] [,2] [,3] [,4] 
[1,] 2 1 0 -3 
[2,] 2 0 -2 0 
[3,] -4 -1 2 3 

重建米,這樣它不是一個列表

m = matrix(unlist(mget(g)), nr = 3, ncol = 4) 

現在,檢查它們是相同的:

identical(m, myMat) 
[1] TRUE 
+0

@rnorouzian這與'a [。,。] - (mr [。] + mc [。])+ gr'相同。 – lmo

0

也許它有R可與矩陣的方式做。

m = matrix(c(1,2,3,4), nrow =2) 

矩陣得到由列填滿,所以在我的情況:

$$ \ BEGIN {pmatrix} 3 \ \ {端} pmatrix $$

如果你希望它是,否則,您可以指定不喜歡這樣寫道:

m = matrix(c(1,2,3,4),nrow = 2, byrow = TRUE) 

應該工作。