用圆形图案填充矩阵

时间:2013-11-19 01:28:33

标签: r

我想编写一个函数,用m填充矩阵m,其中m是奇数,如下所示: 1)它从矩阵的中间单元开始(例如5乘5 A,矩阵中间单元是A [2,2]),并在那里放1号 2)它向前移动一个单元格并将1添加到前一个单元格并将其放入第二个单元格中 3)它下降并放3,左4,左5,上6,上7,...... 例如,结果矩阵可能是这样的:

> 7 8 9 
  6 1 2
  5 4 3

有人可以帮我实施吗?

1 个答案:

答案 0 :(得分:1)

max_x=5
len=max_x^2
middle=ceiling(max_x/2)
A=matrix(NA,max_x,max_x)

increments=Reduce(
    f=function(lhs,rhs) c(lhs,(-1)^(rhs/2+1)*rep(1,rhs)),
    x=2*(1:(max_x)),
    init=0
    )[1:len]
idx_x=Reduce(
    f=function(lhs,rhs) c(lhs,rep(c(TRUE,FALSE),each=rhs)),
    1:max_x,
    init=FALSE
    )[1:len]
increments_x=increments
increments_y=increments
increments_x[!idx_x]=0
increments_y[idx_x]=0

A[(middle+cumsum(increments_x)-1)*(max_x)+middle+cumsum(increments_y)]=1:(max_x^2)

给出

#> A
#     [,1] [,2] [,3] [,4] [,5]
#[1,]   21   22   23   24   25
#[2,]   20    7    8    9   10
#[3,]   19    6    1    2   11
#[4,]   18    5    4    3   12
#[5,]   17   16   15   14   13

说明: 向量increments表示沿着增加数字的路径的步骤。对于未更改/增加/减少的行和列索引,它是0/+1/-1。这里重要的是这些数字不区分列和行的步骤。这由向量idx_x管理 - 它屏蔽了行(TRUE)或列(FALSE)的增量。 最后一行考虑了R的索引逻辑(矩阵索引沿列增加)。


编辑: 根据OP的请求,这里有一些关于如何计算increments向量的更多信息。

你总是走两条相等长度的直线(行式或列式)。然而,在你走了两次之后,长度会增加1。这与x=2*(1:(max_x))参数和rep(1,rhs)一致。前两次连续行走是在增加列/行方向。然后沿负方向跟随两个,依此类推(交替)。这由(-1)^(rhs/2+1)计算。