在R中创建一个增加同心数字环的矩阵

时间:2015-11-12 21:45:04

标签: r matrix

我需要在R中编写一个函数来创建一个增加同心数字环的矩阵。这个函数的参数是多个层次。例如,如果x = 3,矩阵将如下所示:

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

我不知道该怎么做。我真的很感激任何建议。

4 个答案:

答案 0 :(得分: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)

注意:上面给出了问题中显示的样本矩阵,但问题的主题是环应该增加,这可能意味着从中心到外部增加,所以如果这是想要在mmidDist与以前一样的情况下尝试此操作:

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

答案 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

答案 2 :(得分: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

答案 3 :(得分:1)

这是逻辑,在R中自己实现。

  • 创建一个矩阵,其行数和列数等于2 * x-1和 用零填充它并开始遍历从(0,0)到的数组 (2 * X -2,2- * X-2)。
  • 现在,在每个单元格中,计算单元格的“级别”。的水平 单元格距离四边界最近 矩阵,即min(i,j,2 * x-2-i,2 * x-2-j)。
  • 此“级别”值是要放入单元格的值。