Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating a matrix of increasing concentric rings of numbers in R

Tags:

r

matrix

I need to write a function in R that creates a matrix of increasing concentric rings of numbers. This function's argument is a number of layers. For example, if x = 3, matrix will look like following:

1 1 1 1 1  
1 2 2 2 1  
1 2 3 2 1  
1 2 2 2 1  
1 1 1 1 1

I have no idea how to do it. I would really appreciate any suggestions.

like image 488
SirOsric Avatar asked Nov 12 '15 21:11

SirOsric


2 Answers

1) Try this:

x <- 3 # input

n <- 2*x-1
m <- diag(n)
x - pmax(abs(row(m) - x), abs(col(m) - x))

giving:

     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    1    2    2    2    1
[3,]    1    2    3    2    1
[4,]    1    2    2    2    1
[5,]    1    1    1    1    1

2) A second approach is:

x <- 3 # input

n <- 2*x-1
mid <- pmin(1:n, n:1)  # middle row/column
outer(mid, mid, pmin)

giving the same result as before.

3) yet another approach having some similarities to the prior two approaches is:

x <- 3 # input

n <- 2*x-1
Dist <- abs(seq_len(n) - x)
x - outer(Dist, Dist, pmax)

Note: The above gives the sample matrix shown in the question but the subject of the question says the rings should be increasing which may mean increasing from the center to the outside so if that is what is wanted then try this where m, mid and Dist are as before:

pmax(abs(row(m) - x), abs(col(m) - x)) + 1

or

x - outer(mid, mid, pmin) + 1

or

outer(Dist, Dist, pmax) + 1

Any of these give:

     [,1] [,2] [,3] [,4] [,5]
[1,]    3    3    3    3    3
[2,]    3    2    2    2    3
[3,]    3    2    1    2    3
[4,]    3    2    2    2    3
[5,]    3    3    3    3    3
like image 147
G. Grothendieck Avatar answered Oct 03 '22 23:10

G. Grothendieck


Try this:

x<-3
res<-matrix(nrow=2*x-1,ncol=2*x-1)
for (i in 1:x) res[i:(2*x-i),i:(2*x-i)]<-i
res
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    1    1    1    1
#[2,]    1    2    2    2    1
#[3,]    1    2    3    2    1
#[4,]    1    2    2    2    1
#[5,]    1    1    1    1    1
like image 35
nicola Avatar answered Oct 03 '22 23:10

nicola