As part of what will hopefully become a larger post, I’m interested in finding an R way to achieve the following: given an n x n
matrix of zeroes with a single non-zero element of some value v
, fill the surrounding entries such that each other element is at most one less than those surrounding it (up or down). For example, with an 8x8
matrix with a value of 5
at c(5, 5)
, the result would be
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 0 0 0 1 0 0 0
[2,] 0 0 0 1 2 1 0 0
[3,] 0 0 1 2 3 2 1 0
[4,] 0 0 2 3 4 3 2 1
[5,] 1 2 3 4 5 4 3 2
[6,] 0 1 2 3 4 3 2 1
[7,] 0 0 1 2 3 2 1 0
[8,] 0 0 0 1 2 1 0 0
This is somewhat akin to imposing a contour density on top of a single peak, but I really can’t find any suitable approaches. Convolutions came to mind, but I can’t think of or find the appropriate kernel.
Let me know if you have one!
Update:
Thanks to June Choe, this code using outer()
produces the desired matrix for a point at c(vx, vy)
with value vv
in a n x n
matrix
vx <- 4
vy <- 3
vv <- 5
n <- 8
outer(1:n, 1:n, function(x, y) pmax(vv - abs(x - vx) - abs(y - vy), 0))
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,] 0 1 2 1 0 0 0 0
[2,] 1 2 3 2 1 0 0 0
[3,] 2 3 4 3 2 1 0 0
[4,] 3 4 5 4 3 2 1 0
[5,] 2 3 4 3 2 1 0 0
[6,] 1 2 3 2 1 0 0 0
[7,] 0 1 2 1 0 0 0 0
[8,] 0 0 1 0 0 0 0 0