2017-05-01 2 views
0

のうち、私は単純マトリクス持っている:移動平均 - ウィンドウの境界

x <- seq (1:100) 
matrix_A = matrix(x, ncol = 10) 
matrix_A 

を私がやって×3サイズ3

シンプルな機能の実行中のウィンドウですべての値を平均化したいですその次の場合(例えば)i = 1j = 1、私は行列に存在しない値を呼び出していますので、

running_window_v1 <- function(mat.temp){ 

    #Create an empty matrix to store calculations in it 
    mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp)) 

    for (i in (1 : (nrow(mat.temp)))){ 
    for (j in (1 : (ncol(mat.temp)))){ 
     mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1], 
     mat.temp[i - 1, j], 
     mat.temp[i- 1, j + 1], 
     mat.temp[i, j - 1], 
     mat.temp[i, j], 
     mat.temp[i, j + 1], 
     mat.temp[i + 1, j - 1], 
     mat.temp[i + 1, j], 
     mat.temp[i +1, j + 1]) 

    } 
    } 
    return(mat.temp1) 
} 

running_window_v1(matrix_A) 

このスクリプトの問題は、私はエラーを取得し、明白です。私の仕事のために

running_window_v2 <- function(mat.temp){ 

    #Create an empty matrix to store calculations in it 
    mat.temp1=matrix(NA,ncol = ncol(mat.temp), nrow = nrow(mat.temp)) 

    for (i in (2 : (nrow(mat.temp)-1))){ 
    for (j in (2 : (ncol(mat.temp)-1))){ 
     mat.temp1[i,j] = mean (mat.temp[i - 1, j - 1], 
           mat.temp[i - 1, j], 
           mat.temp[i- 1, j + 1], 
           mat.temp[i, j - 1], 
           mat.temp[i, j], 
           mat.temp[i, j + 1], 
           mat.temp[i + 1, j - 1], 
           mat.temp[i + 1, j], 
           mat.temp[i +1, j + 1]) 

    } 
    } 
    return(mat.temp1) 
} 


> running_window_v2(matrix_A) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
[1,] NA NA NA NA NA NA NA NA NA NA 
[2,] NA 1 11 21 31 41 51 61 71 NA 
[3,] NA 2 12 22 32 42 52 62 72 NA 
[4,] NA 3 13 23 33 43 53 63 73 NA 
[5,] NA 4 14 24 34 44 54 64 74 NA 
[6,] NA 5 15 25 35 45 55 65 75 NA 
[7,] NA 6 16 26 36 46 56 66 76 NA 
[8,] NA 7 17 27 37 47 57 67 77 NA 
[9,] NA 8 18 28 38 48 58 68 78 NA 
[10,] NA NA NA NA NA NA NA NA NA NA 

、私が情報を失うことはありませんし、私が使用して、もちろん(もエッジを平均化する必要があることは本当に重要です:だから、この関数は、私は次のようにそれを変更する場合にのみ動作します少ない数)。どんな提案がありますか、どのように私のためにうまく動作する機能running_window_v1を変更することができますか? 可能性のあるエッジごとに条件を追加することができますが、よりエレガントな条件を探しています。

答えて

1

あなたが各ループ内で次のような何か行うことができます(というよりも、個々のすべての要素をリストアップし、ここでのインデックスのために範囲を使用する方が簡単です)

mat.temp1[i,j] = mean(mat.temp[max(1,i-1):min(nrow(mat.temp),i+1), 
           max(1,j-1):min(ncol(mat.temp),j+1)]) 
+0

はい、これが答えです。ありがとうございました。 – JerryTheForester

関連する問題