R/csmf.R

Defines functions csmf

Documented in csmf

csmf <- function(data,ker){
    if(!(ncol(ker)==nrow(ker))){
        stop('csmf accepts only square kernels')
    }
    if(!(nrow(ker) %% 2 == 1)){
        stop('csm accepts only odd kernel sizes')
    }
    if((nrow(data) < nrow(ker)) || (ncol(data) < ncol(ker))){
        stop('data matrix smaller than the kernel')
    }
    ksizecount <- floor(nrow(ker)/2.0)
    kerinds <- seq(from=-ksizecount,to=ksizecount,length=ncol(ker))
    pdata <- data
    for(i in 1:ksizecount){
        for(j in 1:ksizecount){
            pdata <- cbind(pdata[,1],pdata,pdata[,ncol(pdata)])
            pdata <- rbind(pdata[1,],pdata,pdata[nrow(pdata),])
        }
    }
    pres <- .Fortran('csmf',
                     matrix(0.0,nrow=nrow(pdata),ncol=ncol(pdata)),
                     as.double(pdata),
                     as.double(ker),
                     as.integer(nrow(pdata)),
                     as.integer(ncol(pdata)),
                     as.integer(nrow(data)),
                     as.integer(ncol(data)),
                     as.integer(ncol(ker)),
                     as.integer(ksizecount),PACKAGE='conv2d')[[1]]
    res <- pres[(1+ksizecount):(nrow(data)+ksizecount),(1+ksizecount):(ncol(data)+ksizecount)]
    return(res)
}
janivaltteri/conv2d documentation built on May 18, 2019, 2:38 p.m.