我想编写一个函数,用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
有人可以帮我实施吗?
答案 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)
计算。