二维数组在一个方向上的卷积 [R]

Convolution of a 2d array in one direction [R]

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

没有这个功能,但是主要思想很简单:

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 次而获得的结果。