在一个项目中,我们需要对矩阵中的数字取平均值。例如,假设一个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是我们的矩阵。不幸的是,我的教授说这太笨拙了,并且比2更适合于循环。我想知道我该如何应用子集并遍历矩阵。
答案 0 :(得分:0)
使用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
上面只是将数组输出格式化回矩阵。