2014-05-13 30 views
1

我試圖在R中找到一個函數,該函數可以平滑一個2D矩陣,該矩陣已根據長度在矩陣周圍填充零的窗戶。如果窗口大小爲3,那麼我們從頂部,底部,右側和左側通過3個零,然後我們進行平均來平滑它。我在SO和其他教程中找到了rollmean,但它並不完全符合我的要求。我需要(如果窗口大小爲3),我們考慮一個3 * 3的窗口並取平均值,並將其替換爲當前窗口的當前元素,然後將窗口向右移動一個單位(像素)。例如,當我們到達最右端時,我們從最左邊角落一個單位開始開窗。 這就是我不想要的rollmean。我想要保留所有9個元素。使用rollmean,filter,rollapply或其他R工具通過移動平均滑動窗口方法平滑2D矩陣

> xm<-matrix(c(1,2,3,4,5,6,7,8,9),ncol=3) 
> xm 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 
> rollmean(xm,3) 
    [,1] [,2] [,3] 
[1,] 2 5 8 

因此,這裏的填充功能,如上文所述:

mat.pad<-function(X,k){ 
    dims<-dim(X) 
    n<-dims[1] 
    m<-dims[2] 
    pad.X <- matrix(0, n + 2 * k, m + 2 * k) 
    pad.X[(k + 1):(n + k), (k + 1):(m + k)] <- X 
    return(pad.X) 
} 

所以,想象一下,這是我的X:

> X 
     [,1] [,2] [,3] 
[1,] 0.5 0.3 0.2 
[2,] 0.5 0.4 0.1 
[3,] 0.4 0.4 0.3 
[4,] 0.4 0.3 0.3 
[5,] 0.3 0.2 0.2 
[6,] 0.5 0.2 0.2 
[7,] 0.5 0.4 0.1 
[8,] 0.4 0.4 0.5 
[9,] 0.3 0.3 0.5 

,這裏是填充的版本,其中k = 3(窗口= 3 * 3)

> mat.pad(X,3) 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] 
[1,] 0 0 0 0.0 0.0 0.0 0 0 0 
[2,] 0 0 0 0.0 0.0 0.0 0 0 0 
[3,] 0 0 0 0.0 0.0 0.0 0 0 0 
[4,] 0 0 0 0.5 0.3 0.2 0 0 0 
[5,] 0 0 0 0.5 0.4 0.1 0 0 0 
[6,] 0 0 0 0.4 0.4 0.3 0 0 0 
[7,] 0 0 0 0.4 0.3 0.3 0 0 0 
[8,] 0 0 0 0.3 0.2 0.2 0 0 0 
[9,] 0 0 0 0.5 0.2 0.2 0 0 0 
[10,] 0 0 0 0.5 0.4 0.1 0 0 0 
[11,] 0 0 0 0.4 0.4 0.5 0 0 0 
[12,] 0 0 0 0.3 0.3 0.5 0 0 0 
[13,] 0 0 0 0.0 0.0 0.0 0 0 0 
[14,] 0 0 0 0.0 0.0 0.0 0 0 0 
[15,] 0 0 0 0.0 0.0 0.0 0 0 0 

如何滑動平均窗口?

+1

你得到它的工作莫娜? –

回答

1

我不確定我是否有這個主意,但我認爲可以用raster::focal?來接近。 見this post

library(raster) 
x <- matrix(c(1,2,3,4,5,6,7,8,9),ncol=3) 
x 
    [,1] [,2] [,3] 
[1,] 1 4 7 
[2,] 2 5 8 
[3,] 3 6 9 

r <- raster(x) # convert to rasterLayer 
## sliding a 3x3 window 
agg <- as.matrix(focal(r, matrix(1, 3, 3), mean, pad = T, padValue = 0)) 
agg 

     [,1]  [,2]  [,3] 
[1,] 1.333333 3.000000 2.666667 
[2,] 2.333333 5.000000 4.333333 
[3,] 1.777778 3.666667 3.111111 

運行在你的榜樣

x2 <- mat.pad(X=x, 3) 
r2 <- raster(x2) 
as.matrix(focal(r2, matrix(1, 3, 3), mean, pad = T, padValue = 0)) 
     [,1] [,2]  [,3]  [,4]  [,5]  [,6]  [,7] [,8] [,9] 
[1,] 0 0 0.0000000 0.0000000 0.000000 0.000000 0.0000000 0 0 
[2,] 0 0 0.0000000 0.0000000 0.000000 0.000000 0.0000000 0 0 
[3,] 0 0 0.1111111 0.5555556 1.333333 1.222222 0.7777778 0 0 
[4,] 0 0 0.3333333 1.3333333 3.000000 2.666667 1.6666667 0 0 
[5,] 0 0 0.6666667 2.3333333 5.000000 4.333333 2.6666667 0 0 
[6,] 0 0 0.5555556 1.7777778 3.666667 3.111111 1.8888889 0 0 
[7,] 0 0 0.3333333 1.0000000 2.000000 1.666667 1.0000000 0 0 
[8,] 0 0 0.0000000 0.0000000 0.000000 0.000000 0.0000000 0 0 
[9,] 0 0 0.0000000 0.0000000 0.000000 0.000000 0.0000000 0 0