【问题标题】:Split matrix into submatrices将矩阵拆分为子矩阵
【发布时间】:2015-03-16 22:07:37
【问题描述】:

我找到了一个类似问题的解决方案,当矩阵可能不是正方形时(因为它可能不是我的情况)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]。我应该能够选择任意大小的子矩阵。我似乎找不到任何提取重叠子矩阵的例子,但我可能想多了。有人对解决此问题的最佳方法有任何想法吗?

【问题讨论】:

    标签: r matrix submatrix


    【解决方案1】:

    也许这样的策略可行

    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 提取具有这些起始位置的每个可能的子矩阵。

    【讨论】:

    • 优秀的答案!我需要停止忘记 expand.grid。
    猜你喜欢
    • 1970-01-01
    • 2014-11-22
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多