2017-10-04 76 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) 

应该工作。