使用sapply代替for循环

时间:2019-04-30 20:08:57

标签: r

在一个项目中,我们需要对矩阵中的数字取平均值。例如,假设一个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更适合于循环。我想知道我该如何应用子集并遍历矩阵。

1 个答案:

答案 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

上面只是将数组输出格式化回矩阵。