将矩阵拆分为子矩阵
Split matrix into submatrices
我找到了一个类似问题的解决方案,当矩阵可能不是正方形(因为它可能不是我的情况)时,将矩阵分解为一组非重叠的子矩阵Function to split a matrix into sub-matrices in 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子矩阵(这是另一个地方,这个问题的答案可能需要与我提到的问题不同)。在我的示例中,应该只返回两个子矩阵。 M[1:4,1:4]
和 M[2:5,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
提取每个可能的子矩阵具有这些起始位置。
我找到了一个类似问题的解决方案,当矩阵可能不是正方形(因为它可能不是我的情况)时,将矩阵分解为一组非重叠的子矩阵Function to split a matrix into sub-matrices in 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子矩阵(这是另一个地方,这个问题的答案可能需要与我提到的问题不同)。在我的示例中,应该只返回两个子矩阵。 M[1:4,1:4]
和 M[2:5,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
提取每个可能的子矩阵具有这些起始位置。