【问题标题】:Populating a matrix based on a list of matrices根据矩阵列表填充矩阵
【发布时间】:2014-03-22 05:45:28
【问题描述】:

假设我有一个相同维度的矩阵列表。例如:

mat = matrix(c(1,2,3,11,12,13,21,22,23), nrow = 3, ncol = 3)
mat.list = rep(list(mat), 3)
mat.list[[2]] = mat.list[[2]]*2.5
mat.list[[3]] = mat.list[[3]]*3.5

我想要的是用length(mat.list)*ncol(mat) 填充一个尺寸为length(mat.list)*nrow(mat) 的超级矩阵——可能初始化如下:

super.mat = matrix(NA, nrow = length(mat.list)*nrow(mat), ncol = length(mat.list)*ncol(mat))

根据这个规则: super.mat[N*(i-1)+n,N*(j-1)+n] = mat.list[[n]][i,j]

地点:

N = length(mat.list)

i和j表示mat.list中矩阵n中的行和列索引

我认为是这样的:

populateMat = function(N, n, i, j, mat, super.mat){
super.mat[N*(i-1)+n,N*(j-1)+n] = mat[i,j]
}

结合一些通过mat.list执行的应用函数:

outer(1:nrow(mat), 1:ncol(mat), Vectorize(function(i,j) populateMat(N,1,i,j,mat,super.mat)))

这里mat 只是mat.list 中的一个元素,应该可以工作,但显然我需要一些帮助才能使其真正工作。

【问题讨论】:

    标签: r matrix outer-join


    【解决方案1】:

    一旦你意识到它只是块对角矩阵的重新排列,你可以想出这样的东西:

    library(Matrix)
    N <- length(mat.list)
    bd <- do.call(bdiag, mat.list)
    i.idx <- order(rep(seq(nrow(bd)/N), N))
    j.idx <- order(rep(seq(ncol(bd)/N), N))
    bd[i.idx, j.idx]
    

    【讨论】:

      【解决方案2】:

      以下是否适合您的需求?:

      sapply(seq_along(mat.list),
             function(x) { 
               super.mat[(seq_len(nrow(super.mat))-1)%%nrow(mat.list[[x]])+1==x,
                         (seq_len(ncol(super.mat))-1)%%ncol(mat.list[[x]])+1==x] <<- mat.list[[x]]
               return(NULL)
              })
      

      结果:

           [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
       [1,]    1   NA   NA   11   NA   NA   21   NA   NA
       [2,]   NA  2.5   NA   NA 27.5   NA   NA 52.5   NA
       [3,]   NA   NA  3.5   NA   NA 38.5   NA   NA 73.5
       [4,]    2   NA   NA   12   NA   NA   22   NA   NA
       [5,]   NA  5.0   NA   NA 30.0   NA   NA 55.0   NA
       [6,]   NA   NA  7.0   NA   NA 42.0   NA   NA 77.0
       [7,]    3   NA   NA   13   NA   NA   23   NA   NA
       [8,]   NA  7.5   NA   NA 32.5   NA   NA 57.5   NA
       [9,]   NA   NA 10.5   NA   NA 45.5   NA   NA 80.5
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-06
        • 1970-01-01
        相关资源
        最近更新 更多