二维阵列在一个方向上的卷积[R]

时间:2017-05-30 13:27:23

标签: arrays r convolution

R中是否有任何函数在二维数组上执行以下过程?

假设我有一个类似的数组:

0    0    0    1    0    1
1    0    0    0    0    0
0    0    1    0    1    0
0    1    0    0    1    1

我想在水平方向上对此数组进行线性卷积,或者更详细地说我想要一个函数来水平移动数组(添加零)并将它生成点到主数组并总结所有元素结果数组。

所以结果将是一个线性向量

在这个例子中,结果将是:

0,2,1,2,1,9,1,2,1,2,0

例如,第二个数字是2,是点生成主矩阵的结果,只有2个最后一列的副本作为第1列和第2列(其余列的其他零填充)并将所有结果相加元素在一起:

0    0    0    1    0    1
1    0    0    0    0    0
0    0    1    0    1    0
0    1    0    0    1    1 

元素产品:

0    1    0    0    0    0
0    0    0    0    0    0
1    0    0    0    0    0
1    1    0    0    0    0  

结果:

0    0    0    0    0    0
0    0    0    0    0    0
0    0    0    0    0    0
0    1    0    0    0    0 

最后通过对所有元素求和得出= 2

1 个答案:

答案 0 :(得分:1)

没有这样的功能,但主要的想法很简单:

shift <- function(m) {
    cbind(m[, -1], rep(0, nrow(m)))
}

shifted_prod <- function(m) {
    mm <- m
    val <- numeric(ncol(m))
    for (i in 1:ncol(m)) {
        m <- shift(m)
        val[i] <- sum(m * mm)
    }
    val
}

shifted_prod(m)
#[1] 1 2 1 1 0 0

我仍然不明白你对结果的期望2(元素[4,2]是1,其他都是0)。您可以添加print语句,逐步观察for循环。

最后你可能想要rev(val)之类的内容(请参阅自己),因为现在val[k]是通过移动原始矩阵k次获得的结果。