在一个项目中,我们需要取矩阵中的数字与其周围的数字的平均值。例如,设想一个3x3矩阵,如下所示
[(1,2,3),
(4,5,6),
(7,8,9)]. 第一步是在矩阵周围添加填充。假设我们添加1层填充,从而得到一个5x5矩阵
[[0,0,0,0,0],
[0,1,2,3,0],
[0,4,5,6,0],
[0,7,8,9,0],
[0,0,0,0,0]].
matrix(c(0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,0,0,0,0), nrow=5, ncol=5, byrow=T)然后,我们对其进行平均和过滤,得到最终的3x3矩阵。此矩阵的第一行/第一列应为(1+2+4+5)/9 = 1.33。
现在,我的代码正常工作,看起来像这样
for(row in (k+1):(nrow(pad.m) - k)){
for(col in (k+1):(ncol(pad.m) - k)) {
y <- pad.m[seq(row-k, row+k), seq(col-k, col+k)]
filter.m[row-k, col-k]<- mean(y)
}其中k是填充的层数,pad.m是我们的矩阵。不幸的是,我的教授说这太笨拙了,他更喜欢应用而不是2for循环。我想知道如何使用sapply对矩阵进行子集和迭代。
发布于 2019-05-01 06:11:35
使用tensorflow。您可以使用卷积层或池化层。示例:
library(tensorflow)
mymat <- matrix(c(0,0,0,0,0,0,1,2,3,0,0,4,5,6,0,0,7,8,9,0,0,0,0,0,0), nrow=5, ncol=5, byrow=T) # Your padded matrix
matrix1 <- tf$constant( array(mymat, dim=c(1,nrow(mymat),ncol(mymat),1)), dtype="float64" )
pool1 <- tf$nn$avg_pool(matrix1, c(1L,2L,2L,1L), c(1L,1L,1L,1L), "SAME")
sess <- tf$Session()
sess$run(tf$global_variables_initializer())
res <- pool1$eval(session=sess)
sess$close()以上取2x2区域的平均值。但是您将2x2区域相加,然后除以9,这很奇怪,但也没问题。所以你可以得到这样的结果:
res <- res[1,,,]
(res * 4/9)[-1,][,-1][-(3:4),][,-(3:4)]
[,1] [,2]
[1,] 1.333333 1.777778
[2,] 2.666667 3.111111上面的代码只是将数组输出格式化为矩阵。
https://stackoverflow.com/questions/55928033
复制相似问题