0

次の行列があるとします。

> mat <- matrix(c( rep(1:12,1)), 4, 4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    1    5    9    1
[2,]    2    6   10    2
[3,]    3    7   11    3
[4,]    4    8   12    4

囲まれた要素の平均を使用して、中央の 4 つの値を置き換えたい。私はそれを使用してそれを行うことができます:

for (i in 1:1000){
  mat[2,2]=  (mat[1,2] + mat[2,1] + mat[3,2] + mat[2,3])/4
  mat[2,3]=  (mat[2,2] + mat[2,4] + mat[1,3] + mat[3,3])/4
  mat[3,2]=  (mat[3,1] + mat[3,3] + mat[2,2] + mat[4,2])/4
  mat[3,3]=  (mat[3,2] + mat[3,4] + mat[4,3] + mat[2,3])/4
  print(mat)
}

私の質問は次のとおりです。これを関数に変換して、選択した行列要素 (つまりmat[2:3,2:3]) に直接適用できるようにするにはどうすればよいですか?

4

2 に答える 2

3
GSfun <- function(M, r, c) {sum(matrix(c(0,1,0,
                                         1,0,1,
                                         0,1,0), 3) * 
                                 M[r+(-1:1),c+(-1:1)]) /4 }

for (i in 2:3){ for (j in 2:3){  mat[i,j] <- GSfun(mat, i,j)}}
mat
     [,1] [,2]  [,3] [,4]
[1,]    1    5  9.00    1
[2,]    2    6  7.00    2
[3,]    3    7  7.25    3
[4,]    4    8 12.00    4
for (i in 2:3){ for (j in 2:3){  mat[i,j] <- GSfun(mat, i,j)}}
mat
     [,1]  [,2]    [,3] [,4]
[1,]    1 5.000  9.0000    1
[2,]    2 5.250  5.8750    2
[3,]    3 5.875  6.6875    3
[4,]    4 8.000 12.0000    4

絶対偏差の合計が 0.01 未満になるまで反復適用:

 maxiter = 20; n=1; repeat { n=n+1; 
     diverg <- sum(abs(mat[2:3, 2:3])); 
     for (i in 2:3){ for (j in 2:3){  mat[i,j] <- GSfun(mat, i,j)}}; 
     if ( n>maxiter | (diverg - sum(abs(mat[2:3, 2:3])) < 0.01) ) {break}  }
 n
# [1] 8
 mat
#------------
     [,1]     [,2]      [,3] [,4]
[1,]    1 5.000000  9.000000    1
[2,]    2 4.500732  5.500366    2
[3,]    3 5.500366  6.500183    3
[4,]    4 8.000000 12.000000    4
于 2013-10-09T22:00:09.570 に答える