这个问题适用于项目,与homeworks / acads无关。我是一名工作统计学家。 所以我的问题是,你如何编写一个R函数,给定一个包含400行和两列的矩阵,其中每20行从第一行开始,在下面的点网格中形成第一行坐标,我想要这个函数返回网格中每个单独正方形/矩形的四个角:
因此输出将有四列,每行表示一个矩形。我只查看相同大小的相邻矩形,例如,如果下面的数字表示示例矩阵的行索引(有两列):
行索引示例:
1 2 3
4 5 6
7 8 9
必须按以下顺序遍历:
[1,2,4,5],[2,3,5,6],[4,5,7,8],[5,6,8,9] and
从示例输入数据集返回相应的2d点 这将有9行和2点。但就是这样,这里的网格被指定为3乘3,而在我的例子中,网格是20乘20,我的输入数据集是400行乘2列。如果你查看遍历的结果,有一个模式,其中每个4点块中的行索引递增1.我只想将其推广到400乘2或任何有2列矩阵点的设置,并且提到网格维度。
答案 0 :(得分:1)
如果您想创建一个可向下和/或横跨400x400空间的可移动20 x 20“窗口”,请使用:
mcorners <- function(xidx, yidx) mat[xidx:(xidx+19),
yidx:(yidx+19])
mcorners(1,1) # should return mat[1:20, mat1:20]
然后为mcorners()
提供参数,以满足您稍微模糊描述的需求。第一列的遍历可能涉及:
sapply(1:381, function(ix) yourfunc( mcorners(ix, 1) ) )
答案 1 :(得分:1)
如果我理解正确的话,这是一个解决方案。说实话,这是一个非常有趣的问题。 :d
这个想法是创建一个给定边长的框,然后围绕网格移动这个框并记录它的顶点。请参阅以下内容:
# Assuming the grid is always a square grid.
grid.size <- 20
# The matrix of row indices.
rindex.grid <- matrix(1:(grid.size * grid.size),
nrow=grid.size, ncol=grid.size, byrow=TRUE)
# We can traverse the grid by moving any given square either right or down in any
# single move. We choose to go right.
move.square.right <- function (this.square, steps=1) {
new.square <- this.square + steps
}
# Going right, capture co-ordinates of all squares in this row.
collect.sq.of.edge.length.in.row.number <- function (grid.size, elength,
rownum=1) {
first.square.in.row <- (rownum - 1) * grid.size + c(1, elength)
first.square.in.row <- c(first.square.in.row,
first.square.in.row + grid.size * (elength - 1))
squares.in.row <- t(sapply(X=seq_len(grid.size - (elength - 1)) - 1,
FUN=move.square.right,
this.square=first.square.in.row))
squares.in.row
}
# Now we start going down the columns and using the function above to collect
# squares in each row. The we will rbind the list of squares in each row into a
# dataframe. So what we get is a (grid.size - (elength - 1) ^ 2) x 4 matrix where
# each row is the co-ordinates of a square of edge length elength.
collect.sq.of.edge.length.in.grid <- function (grid.size, elength) {
all.squares=lapply(X=seq_len(grid.size - (elength - 1)),
FUN=collect.sq.of.edge.length.in.row.number,
grid.size=grid.size, elength=elength)
all.squares <- do.call(rbind, all.squares)
all.squares
}
这似乎表明我们为所有边长获得了正确数量的方框:
tmp <- sapply(1:20, collect.sq.of.edge.length.in.grid, grid.size=grid.size)
sapply(tt, nrow)
[1] 400 361 324 289 256 225 196 169 144 121 100 81 64 49 36 25 16 9 4 1
另外,它适用于您的3x3示例:
collect.sq.of.edge.length.in.grid(grid.size=3, elength=2)
[,1] [,2] [,3] [,4]
[1,] 1 2 4 5
[2,] 2 3 5 6
[3,] 4 5 7 8
[4,] 5 6 8 9