.
-, @VincentZoonekynd.
- .
, ~ 5000x1000x3 (5000/kernelSize) x (1000/kernelSize) x 3.
( , ):
sz <- c(1000,300,3)
img <- array(runif(prod(sz)),dim=sz)
kernelSize <- 3
outSz <- c(ceiling(sz[1:2]/kernelSize),3)
FUN <- mean
0:
t0 <- system.time({
out0 <- array(NA,dim=outSz)
for ( i in seq(1,sz[1],by=kernelSize) ) {
for ( j in seq(1,sz[2],by=kernelSize) ) {
for ( c in 1:sz[3] ) {
out0[ ceiling(i/kernelSize), ceiling(j/kernelSize),c ] <-
FUN(img[ pmin(i-1 + 1:kernelSize,sz[1]),
pmin(j-1 + 1:kernelSize,sz[2]),
c])
}
}
}})
1:
t1 <- system.time({
out1 <- tapply(
img,
list( floor((slice.index(img,1)-1)/kernelSize),
floor((slice.index(img,2)-1)/kernelSize),
slice.index(img,3) ),
FUN )
})
cat('METHOD 0:',t0['elapsed'],'\n')
cat('METHOD 1:',t1['elapsed'],'\n')
cat(all(out0==out1),'\n')
:
METHOD 0: 13.549
METHOD 1: 19.415
TRUE
, , img.
(), , METHOD 0 () 1 (tapply).
, , tapply , (?) , -... , for , ).
, vapply sapply apply ( , , , ).
2: vapply
, , vapply.
(, 3- , ...).
img. (i,j) kernelSize*kernelSize.
vapply .
t2 <- system.time({
is <- seq(1,sz[1],by=kernelSize)
js <- seq(1,sz[2],by=kernelSize)
coords <- cbind( rep.int(is,length(js)), rep(js,each=length(is)) )
out2 <- array(NA,dim=outSz)
for ( c in 1:sz[3] ) {
out2[,,c] <- array(
vapply( 1:nrow(coords), function(i) {
FUN(img[coords[i,1]:pmin(sz[1],coords[i,1]+kernelSize-1),
coords[i,2]:pmin(sz[2],coords[i,2]+kernelSize-1),
c])
}, 0 ),
dim=outSz[1:2] )
}})
cat('METHOD 2:',t2['elapsed'],'\n')
cat(all(out0==out2),'\n')
:
METHOD 2: 12.627
TRUE
, , vapply ( , vapply, , ... ).
3:
, , , [ 1/3 1/3 1/3 ] .
FUN, .
, [1/3, 1/3, 1/3] img , x y. ( ).
, 3x3 , , , R, , .
- , 2x2 , - 4 9 .
, , , - .
( , ...)
t3 <- system.time({
is <- pmin(seq(1,sz[1],by=kernelSize) + floor(kernelSize/2),sz[1]-1)
js <- pmin(seq(1,sz[2],by=kernelSize) + floor(kernelSize/2),sz[2]-1)
out3 <- array(NA,dim=outSz)
for ( c in 1:3 ) {
out3[,,c] <- (t(filter(
t(filter(img[,,c],rep(1,kernelSize))),
rep(1,kernelSize))))[is,js]
}
out3 <- out3/(kernelSize*kernelSize)
})
cat('METHOD 3:',t3['elapsed'],'\n')
cat(sum(out0!=out3),'\n')
:
METHOD 3: 1.593
300
, , , , out3 ( ), ( ) .