首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sapply而不是for循环

使用sapply而不是for循环
EN

Stack Overflow用户
提问于 2019-05-01 04:08:57
回答 1查看 71关注 0票数 1

在一个项目中,我们需要取矩阵中的数字与其周围的数字的平均值。例如,设想一个3x3矩阵,如下所示

代码语言:javascript
复制
[(1,2,3), 
 (4,5,6), 
 (7,8,9)]. 

第一步是在矩阵周围添加填充。假设我们添加1层填充,从而得到一个5x5矩阵

代码语言:javascript
复制
[[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

现在,我的代码正常工作,看起来像这样

代码语言:javascript
复制
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对矩阵进行子集和迭代。

EN

回答 1

Stack Overflow用户

发布于 2019-05-01 06:11:35

使用tensorflow。您可以使用卷积层或池化层。示例:

代码语言:javascript
复制
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,这很奇怪,但也没问题。所以你可以得到这样的结果:

代码语言:javascript
复制
res <- res[1,,,]
(res * 4/9)[-1,][,-1][-(3:4),][,-(3:4)]


         [,1]     [,2]
[1,] 1.333333 1.777778
[2,] 2.666667 3.111111

上面的代码只是将数组输出格式化为矩阵。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55928033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档