3

マトリックスが正方形ではない可能性がある場合(私の状況ではそうではない可能性があるため)、マトリックスを重複しないサブマトリックスのセットに分割する同様の質問に対する解決策を見つけましたR. _ ただし、私の場合、マトリックスをオーバーラップさせたいと考えています。次のマトリックスを例として使用します。

M <- matrix(1:20, 5)

#     [,1] [,2] [,3] [,4]
#[1,]    1    6   11   16
#[2,]    2    7   12   17
#[3,]    3    8   13   18
#[4,]    4    9   14   19
#[5,]    5   10   15   20

サブマトリックスの行数と列数をそれぞれ 4 と 4 に選択した場合、返されるサブマトリックスは、元のマトリックスの境界内に完全に収まるすべての重複する 4X4 サブマトリックスである必要があります (これは別の場所です)。この質問への回答は、私が参照した質問とは異なる必要があるかもしれません)。私の例では、返される必要があるサブマトリックスは 2 つだけです。 M[1:4,1:4]M[2:5,1:4]。サブマトリックスの任意のサイズを選択できるはずです。重複する部分行列を抽出する例を見つけることができないようですが、これは考えすぎている可能性があります。これを行うための最良の方法について何か考えがある人はいますか?

4

1 に答える 1

4

このような戦略がうまくいくかもしれません

submat <- function(m, nrow, ncol) {
    stopifnot(nrow(m)>=nrow, ncol(m)>=ncol)
    rowstarts<-1:(nrow(m)-nrow+1)
    colstarts<-1:(ncol(m)-ncol+1)
    ss <- function(r, c) {
        m[r:(r+nrow-1), c:(c+ncol-1), drop=FALSE]
    }
    with(expand.grid(r=rowstarts, c=colstarts), mapply(ss, r, c, SIMPLIFY=FALSE))
}

submat(M, 4, 4)

行と列の可能な開始インデックスがどこにあるかを決定し、 を使用expand.grid()してそのような開始値の可能なすべての組み合わせを生成し、 を使用mapplyしてそれらの開始位置で可能なすべての部分行列を抽出します。

于 2015-01-18T22:33:03.953 に答える