假设我有一个具有相同维度的矩阵列表。例如:
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
我想要的是用长度(mat.list)填充超级矩阵(mat.list)* nrow(mat)by length(mat.list)* ncol(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
我认为有以下几点:
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
的单个元素,应该可以正常工作,但显然我需要一点帮助才能真正发挥作用。
答案 0 :(得分: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]
答案 1 :(得分:0)
以下是否符合您的需求?:
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