使用移动平均滑动窗口方法,使用rollmean、filter、rollapply或其他R工具平滑2D矩阵
我试图在R中找到一个函数,它可以平滑2D矩阵,该矩阵根据窗口的长度已经在矩阵周围填充了零。如果窗口大小为3,那么我们从顶部、底部、右侧和左侧取3个零,然后进行平均以使其平滑。我在SO和其他教程中找到了rollmean,但它并不完全符合我的要求。我需要(假设窗口大小是3),我们考虑一个3×3的窗口,取平均值,用当前窗口的当前元素替换它,然后将窗口向右移动一个单位(像素)。例如,当我们到达最右端时,我们从最左角向下一个单位开始开窗。 这就是我不想做的事。我想保留我所有的9个元素使用移动平均滑动窗口方法,使用rollmean、filter、rollapply或其他R工具平滑2D矩阵,r,image-processing,matrix,mean,moving-average,R,Image Processing,Matrix,Mean,Moving Average,我试图在R中找到一个函数,它可以平滑2D矩阵,该矩阵根据窗口的长度已经在矩阵周围填充了零。如果窗口大小为3,那么我们从顶部、底部、右侧和左侧取3个零,然后进行平均以使其平滑。我在SO和其他教程中找到了rollmean,但它并不完全符合我的要求。我需要(假设窗口大小是3),我们考虑一个3×3的窗口,取平均值,用当前窗口的当前元素替换它,然后将窗口向右移动一个单位(像素)。例如,当我们到达最右端时,我们从最左角向下一个单位开始开窗。 这就是我不想做的事。我想保留我所有的9个元素 > xm<
> 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
这是k=3的填充版本(窗口=3*3)
我怎样才能滑动平均窗口呢?我不确定我是否有这个想法,但我认为可以通过
光栅::焦点?
来实现。
看
库(光栅)
莫娜,你能用吗?
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
[,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
> 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
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