语言是R.
我有一个nxm矩阵,我想将它分成3x3部分并计算每个部分的平均值(或任何函数).(如果有一个剩余的位不是3x3那么就使用剩下的东西).
我确信有一种apply
方法可以做到这一点 - 这是我的舌头 - 但我的大脑目前正在让我失望.我想这有点像移动窗口问题,除了我想要非重叠的窗口(所以它更容易).
任何人都可以想到这样做的内置函数吗?还是矢量化的方式?
这是我的循环版本:
winSize <- 3
mat <- matrix(runif(6*11),nrow=6,ncol=11)
nr <- nrow(mat)
nc <- ncol(mat)
outMat <- matrix(NA,nrow=ceiling(nr/winSize),
ncol=ceiling(nc/winSize))
FUN <- mean
for ( i in seq(1,nr,by=winSize) ) {
for ( j in seq(1,nc,by=winSize) ) {
# work out mean in 3x3 window, fancy footwork
# with pmin just to make sure we don't go out of bounds
outMat[ ceiling(i/winSize), ceiling(j/winSize) ] <-
FUN(mat[ pmin(i-1 + 1:winSize,nr), pmin(j-1 + 1:winSize,nc)])
}
}
Run Code Online (Sandbox Code Playgroud)
干杯.
您可以使用row
和col
提取行号和列号,然后计算每个块的坐标.
tapply(
mat,
list( floor((row(mat)-1)/winSize), floor((col(mat)-1)/winSize) ),
mean
)
Run Code Online (Sandbox Code Playgroud)
编辑:通过替换row
和col
使用以下函数,可以将其推广到更高维数组.
a <- function( m, k ) {
stopifnot( "array" %in% class(m) || "matrix" %in% class(m) )
stopifnot( k == floor(k) )
stopifnot( k > 0 )
n <- length(dim(m))
stopifnot( k <= n )
i <- rep(
1:dim(m)[k],
each = prod(dim(m)[ 1:n < k ]),
times = prod(dim(m)[ 1:n > k ])
)
array(i, dim=dim(m))
}
# A few tests
m <- array(NA, dim=c(2,3))
all( row(m) == a(m,1) )
all( col(m) == a(m,2) )
# In dimension 3, it can be done manually:
m <- array(NA, dim=c(2,3,5))
all( a(m,1) == array( rep(1:dim(m)[1], times=prod(dim(m)[2:3])), dim=dim(m) ) )
all( a(m,2) == array( rep(1:dim(m)[2], each=dim(m)[1], times=dim(m)[3]), dim=dim(m) ) )
all( a(m,3) == array( rep(1:dim(m)[3], each=prod(dim(m)[-3])), dim=dim(m) ) )
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
449 次 |
最近记录: |