二维数组在一个方向上的卷积 [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
次而获得的结果。
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
次而获得的结果。