对于一个矩阵M,以及一个核矩阵K,我希望有一个函数可以实现以下步骤:
- 选定M中的一个元素x
- 以元素x为中心,提取元素x所在的一个大小和K相同的矩阵V
- 将V和K中的元素对应相乘后求和,得到一个具体数值x‘
- 循环M中每一个元素x,计算对应x’,得到一个新的M‘
我在python中找到了一个能实现此功能的函数correlate2d
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.correlate2d.html
以下是我为临时使用,在R中自己写的,请问有没有类似的,更加专业和标准的包?
correlate2d <- function(mat){
# 首先给矩阵M包一圈0,得到mat_aug
rows = nrow(mat); cols = nrow(mat)
col_append <- rep(0, rows); row_append <- rep(0, cols + 2)
mat_aug <- cbind(col_append, mat, deparse.level = F) %>%
cbind(., col_append, deparse.level = F) %>%
rbind(row_append, ., deparse.level = F) %>%
rbind(., row_append, deparse.level = F)
# 创建一个kernel
kernel = matrix(1, nrow = 3, ncol = 3); kernel[2,2] <- 0
# 用for循环滚动计算
res <- matrix(NA, nrow = rows, ncol = cols) # 存储结果的
for (i in 1:rows){
for (j in 1:cols){
window <- mat_aug[i:(i + 2), j:(j + 2)]
res[i, j] <- sum(window * kernel)
}
}
return(res)
}