2015-11-12 12 views
8

Rの中に同心円の数が増える行列を作る関数を書く必要があります。この関数の引数は、いくつかのレイヤーです。たとえば、x = 3の場合、行列は次のようになります。数値の同心円環が増加する行列を作成する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 

どのようにすればいいのかわかりません。私は本当に何か提案を感謝します。

答えて

7

これを試してください:

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)これを試してください:

x <- 3 # input 

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

寄付:

 [,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)第二のアプローチである。

x <- 3 # input 

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

と同じ結果が得られます。

3)まだ前の二つのアプローチにいくつかの類似点を有する別のアプローチがある:

x <- 3 # input 

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

注:上記の問題に示すサンプルマトリックスを与えるが、問題の主題は言いますリングが増加して中央から外側に向かっていることを意味するので、もし望むならそれを試してみてください。mmidおよびDistは以前と同じです:

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

又は

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

又は

outer(Dist, Dist, pmax) + 1 

これらのいずれも与える:

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

キック用の再帰溶液(奇数Nのみ)

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

ここLogicの、(ゼロでそれを埋めるとからアレイを横断開始2 * X-1及び に等しい行と列の数とマトリックスを作成

  • R.

    でそれを0,0自身を実装)から (2 * x-2,2 * x-2)に減少する。
  • ここで、各セルで、セルの 'レベル'を計算します。 のレベルは、 の4つの境界、すなわちmin(i、j、2 * x-2-i、2 * x-2-j)からのセルとの最も近い距離である。
  • この 'レベル'の値は、セルに配置される値です。
関連する問題