2015-11-12 19 views
8

Potrzebuję napisać funkcję w R, która tworzy macierz rosnących koncentrycznych pierścieni liczb. Argument tej funkcji jest liczbą warstw. Na przykład, jeśli x = 3, macierz będzie wyglądać następująco:Tworzenie macierzy rosnących koncentrycznych pierścieni liczb w 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 

Nie mam pojęcia, jak to zrobić. Byłbym wdzięczny za wszelkie sugestie.

Odpowiedz

7

Spróbuj tego:

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) Spróbuj tego:

x <- 3 # input 

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

dawanie:

 [,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) Drugie podejście jest:

x <- 3 # input 

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

podając taki sam wynik jak poprzednio.

3) Jeszcze inne podejście mające pewne podobieństwa do poprzednich dwóch podejść jest:

x <- 3 # input 

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

Uwaga: Powyższy daje matrycy próbek pokazano na pytanie, ale przedmiotem pytanie mówi Pierścienie powinny się zwiększać, co może oznaczać zwiększenie od środka na zewnątrz, więc jeśli to jest to, co jest potrzebne, spróbuj tego, gdzie m,i są jak wcześniej:

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

lub

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

lub

outer(Dist, Dist, pmax) + 1 

Każdy z nich daje:

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

cykliczna rozwiązanie rzuty (nieparzyste n tylko)

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

Oto logika, wdrożyć go samodzielnie w R.

  • utworzyć macierz z liczbą wierszy i kolumn równa 2 * x-1 i wypełnić go z zer i rozpocząć przechodzenie z tablicy (0,0) do (2 * x-2,2 * x-2).
  • Teraz w każdej komórce oblicz "poziom" komórki. Poziom komórki wynosi najbliższą odległość od czterech granic macierzy, tj. Min (i, j, 2 * x-2-i, 2 * x-2-j).
  • Ta wartość "poziomu" to wartość, którą należy umieścić w komórce.