【问题标题】:Convolution of a 2d array in one direction [R]二维数组在一个方向上的卷积 [R]
【发布时间】:2017-05-30 13:27:22
【问题描述】:

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

【问题讨论】:

  • 你的描述还是有点不清楚。你的意思是像sum(m1 * m2)这样的逐点矩阵乘法吗?然后我希望第二个数字是 1 而不是 2。
  • @tonytonov 感谢提及,我编辑了这篇文章。请再读一遍。

标签: arrays r convolution


【解决方案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 移动次数获得的结果。

【讨论】:

  • 谢谢,我自己实现了一个功能,但我正在寻找是否有任何特殊的快速实现...感谢您的代码
  • 不客气。如果快速是指真正的快速,也许你应该采取 Rcpp 路线。另一个优化提示是就地替换元素,而不复制矩阵(即没有cbind,没有重新分配)。
猜你喜欢
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 2018-04-09
  • 1970-01-01
  • 2017-02-24
相关资源
最近更新 更多