gpt4 book ai didi

R:将 FUN 应用于数组的 kxk 子部分

转载 作者:行者123 更新时间:2023-12-04 10:10:32 25 4
gpt4 key购买 nike

语言是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)])
}
}

干杯。

最佳答案

您可以使用 rowcol提取行号和列号,
然后计算每个块的坐标。

tapply( 
mat,
list( floor((row(mat)-1)/winSize), floor((col(mat)-1)/winSize) ),
mean
)

编辑:这可以推广到高维数组,通过替换 rowcol具有以下功能。
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) ) )

关于R:将 FUN 应用于数组的 kxk 子部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9171904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com