Использование sapply вместо цикла for - PullRequest
1 голос
/ 30 апреля 2019

Работа над проектом, в котором нам нужно взять среднее число чисел в матрице с теми, кто вокруг него. Например, представьте матрицу 3x3, такую ​​как

[(1,2,3), 
 (4,5,6), 
 (7,8,9)]. 

Шаг 1 - добавить отступы вокруг матрицы. Допустим, мы добавили 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 петель. Мне было интересно, как я могу подмножество и перебрать матрицу с sapply.

1 Ответ

0 голосов
/ 01 мая 2019

Используйте 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()

Выше приведено среднее значение по регионам 2х2. Но вы сложили 2х2 региона, а затем поделили на 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

Выше приведено только форматирование вывода массива обратно в матрицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...