Язык - R.
У меня есть матрица nxm, и я хотел бы разбить ее на 3x3 части и вычислить среднее (или любую функцию) в каждой из них. (Если останется часть, которая не 3x3, то использовать только то, что осталось).
Я уверен, что есть прикладной
способ сделать это - он у меня на кончике языка - но мой мозг сейчас меня подводит.
Полагаю, это немного похоже на вопрос о перемещении окна, только я хочу, чтобы окна не перекрывались (так проще).
Может ли кто-нибудь вспомнить встроенную функцию, которая это делает? Или векторный способ?
Вот моя зацикленная версия:
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)])
}
}
ура.