2017-10-04 3 views
0

私は最初の部分を作成して、簡単な計算を繰り返さないようにしようとしています。しかし、私はの2番目の部分(2番目の部分は正しい答えを与える)によって計算されたのと同じ結果を得られないのはなぜだろうか?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を使用することができます。それは今リスト

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

にならないように

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を再構築し、それらが同一であることを確認してください。

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

@rnorouzianこれは 'a [。、。] - (mr [。] + mc [。])+ gr'と同じです。 – lmo

0

は、おそらくそれはRが行列で動作する方法に関係しています。

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

行列は、列によって埋め得る私の場合そう:

$$ \開始{pmatrixの} 3 \ 端\ {} pmatrixの$$

あなたはそれがそうでないようにしたい場合、あなたはこのようにそれを行う指定することができます。

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

は動作するはずです。

関連する問題