【问题标题】:Block-diagonal binding of matrices矩阵的块对角线绑定
【发布时间】:2013-07-03 23:13:17
【问题描述】:

R 是否具有将矩阵绑定为块对角线形状的基函数?

下面的工作,但我想知道是否有一个标准的方式:

a <- matrix(1:6, 2, 3)
b <- matrix(7:10, 2, 2)

rbind(cbind(a, matrix(0, nrow=nrow(a), ncol=ncol(b))),
      cbind(matrix(0, nrow=nrow(b), ncol=ncol(a)), b))

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    3    5    0    0
#[2,]    2    4    6    0    0
#[3,]    0    0    0    7    9
#[4,]    0    0    0    8   10

【问题讨论】:

标签: r matrix


【解决方案1】:
foo = function(...){
    d = list(...)
    nrows = sum(sapply(d, NROW))
    ncols = sum(sapply(d, NCOL))
    ans = matrix(0, nrows, ncols)
    i1 = 1
    j1 = 1        
    for (m in d){
        i2 = i1 + NROW(m) - 1
        j2 = j1 + NCOL(m) - 1
        ans[i1:i2, j1:j2] = m
        i1 = i2 + 1
        j1 = j2 + 1
    }
    return(ans)
}

foo(a, b)
#      [,1] [,2] [,3] [,4] [,5]
# [1,]    1    3    5    0    0
# [2,]    2    4    6    0    0
# [3,]    0    0    0    7    9
# [4,]    0    0    0    8   10

【讨论】:

    【解决方案2】:

    adiag 来自包 magic 做你想做的事:

    library(magic)
    adiag(a,b)
         [,1] [,2] [,3] [,4] [,5]
    [1,]    1    3    5    0    0
    [2,]    2    4    6    0    0
    [3,]    0    0    0    7    9
    [4,]    0    0    0    8   10
    

    或者,您可以使用包Matrix 和函数bdiag

    library(Matrix)
    bdiag(a,b)
    4 x 5 sparse Matrix of class "dgCMatrix"
    
    [1,] 1 3 5 .  .
    [2,] 2 4 6 .  .
    [3,] . . . 7  9
    [4,] . . . 8 10
    

    返回一个稀疏矩阵并且可能更有效。使用as.matrix(bdiag(a,b)) 获得一个普通的。

    【讨论】:

    • adiag 添加如果您的矩阵存储在列表中(例如lst&lt;-list(a,b)),您将需要使用Reduce(adiag,lst),因为它似乎不知道如何解析本地列出
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 2015-05-21
    • 2018-05-09
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多