0

この質問はプロジェクトに関するものであり、宿題/アカデミックとは関係ありません。私は働く統計学者です。だから私の質問は、400行と2列の行列が与えられ、最初から20行ごとに20行ごとに、以下のような点のグリッドで座標の最初の行を形成するR関数をどのように書くかです。グリッド内の個々の正方形/長方形の 4 つの角を返すには:

したがって、出力には 4 つの列があり、各行は長方形を示します。たとえば、以下の数字が例の行列 (2 つの列がある) の行インデックスを表す場合と同じサイズの隣接する四角形のみを見ています。

行インデックスの例:

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

9 行と 2 点を持つ入力データ セットの例から、対応する 2 次元点を返します。しかし、ここではグリッドは 3 x 3 に指定されていますが、私の例ではグリッドは 20 x 20 で、入力データセットは 400 行 x 2 列です。トラバースされた結果を見ると、各 4 ポイント ブロックの行インデックスが 1 ずつインクリメントされるパターンがあります。これを 400 x 2 またはポイントの 2 列行列がある任意の設定に一般化したいだけです。グリッド寸法についての言及。

ここに画像の説明を入力

4

2 に答える 2

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
于 2013-06-10T19:16:39.690 に答える