У меня есть матрица M (скажем, r строк и c столбцов), и я хотел бы получить «взвешенную» сумму для каждого элемента матрицы на основе его соседей и создать новую матрицу M2. Слово «сосед» может быть в радиусе 1 (что часто называют соседством Мура в теории клеточных автоматов), или радиус может отличаться от 1, скажем, 2, 3 и т. Д.
Для конкретной ячейки в матрице M, скажем, где-то посередине. Скажем, положение (я, J); тогда (i, j) -я ячейка имеет «восемь» соседей, заданных как
(i-1, j-1), (i-1, j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1).
Я хочу создать матрицу M2, которая вычисляет «взвешенную» сумму (i, j) -й ячейки плюс восемь ее соседей. Взвешивание производится на основе евклидова расстояния между ячейками. Так, например,
exp(-sqrt(2))*M[i-1,j-1] + exp(-1)*M[i-1,j] + exp(-sqrt(2))*M[i-1,j+1] + exp(-1)*M[i,j-1] + M[i,j] + exp(-1)*M[i,j+1] + exp(-sqrt(2))*M[i+1,j-1] + exp(-1)*M[i+1,j] + exp(-sqrt(2))*M[i+1,j+1]
Эта же идея повторяется для всех ячеек (ячейки вдоль границ должны обрабатываться специально, поскольку они не обязательно имеют восемь соседних ячеек). Приведенная выше идея относится к радиусу 1, но код, который я пытаюсь разработать, должен быть универсальным для любого радиуса.
r <- 4
c <- 4
n <- r*c
(M <- matrix(1:n, r, c))
addresses <- expand.grid(x = 1:r, y = 1:c)
#Got this code in the same forum
z <- rbind(c(-1,0,1,-1,1,-1,0,1),c(-1,-1,-1,0,0,1,1,1))
get.neighbors <- function(rw) {
# Convert to absolute addresses
z2 <- t(z + unlist(rw))
# Choose those with indices within mat
b.good <- rowSums(z2 > 0)==2 & z2[,1] <= nrow(M) & z2[,2] <= ncol(M)
M[z2[b.good,]]
}
apply(addresses,1 , get.neighbors) # Returns a list with neighbors
M
По сути, M2 для радиуса = 1 должен быть «взвешенной» суммой текущей ячейки плюс соседей. Текущий текущий элемент всегда получает вес 1.
M = [ 1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16]
M2 = [ 5.033 13.803 .... ....
.... .... .... ....
.... .... .... ....
.... .... .... ....]
Как мне получить матрицу M2 в R? Как насчет, если радиус больше 1? Мне бы хотелось, чтобы взвешивание происходило внутри двух циклов for, чтобы я мог использовать вычисленную взвешенную сумму ячейки [i, j] далее в коде, закрывающем два цикла for.