2015-11-12 7 views
8

Ho bisogno di scrivere una funzione in R che crei una matrice di numeri di anelli concentrici crescenti. L'argomento di questa funzione è un numero di livelli. Ad esempio, se x = 3, la matrice sarà simile al seguente:Creazione di una matrice di numeri di cerchi concentrici crescenti in R

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 

Non ho idea di come farlo. Gradirei davvero qualche suggerimento.

risposta

7

Prova questo:

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 
19

1) Prova questa:

x <- 3 # input 

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

dono:

 [,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) Un secondo approccio è:

x <- 3 # input 

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

dando lo stesso risultato di prima.

3) ancora un altro approccio avente alcune somiglianze precedenti due approcci è:

x <- 3 # input 

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

Nota: Quanto precede rende la matrice del campione mostrato in questione, ma l'oggetto della domanda dice il gli anelli dovrebbero aumentare, il che potrebbe significare aumentare dal centro verso l'esterno, quindi se è quello che si vuole, provare questo dove m, mid e Dist sono come prima:

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

o

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

o

outer(Dist, Dist, pmax) + 1 

Qualsiasi di queste danno:

 [,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 
4

Una soluzione ricorsiva per i calci (n dispari solo)

f <- function(n) if (n == 1) 1 else `[<-`(matrix(1,n,n), 2:(n-1), 2:(n-1), 1+Recall(n-2)) 

f(5) 

#  [,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 
1

Ecco la logica, implementare te in R.

  • creare una matrice con il numero di righe e di colonne pari a 2 * x-1 e riempirlo con zeri e inizia attraversando la matrice da (0,0) a (2 * x-2,2 * x-2).
  • Ora, in ciascuna cella, calcolare il "livello" della cella. Il livello di la cella è la distanza più vicina di esso dai quattro bordi di della matrice, cioè min (i, j, 2 * x-2-i, 2 * x-2-j).
  • Questo valore 'livello' è quello da inserire nella cella.