【发布时间】:2015-11-12 21:45:04
【问题描述】:
我需要在 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
我不知道该怎么做。如果有任何建议,我将不胜感激。
【问题讨论】:
我需要在 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
我不知道该怎么做。如果有任何建议,我将不胜感激。
【问题讨论】:
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)
注意:上面给出了问题中显示的样本矩阵,但问题的主题说环应该增加,这可能意味着从中心到外部增加,所以如果这是想要然后试试这个m、mid和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
【讨论】:
试试这个:
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
【讨论】:
踢的递归解决方案(仅奇数)
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
【讨论】:
这是逻辑,在R中自己实现。
【讨论】: