Заполнение матрицы на основе списка матриц

Допустим, у меня есть список матриц одинаковых размеров. Например:

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) * nrow (mat) по длине (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 обозначают индексы строки и столбца в матрице n в mat.list

Я думаю что-то вроде:

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

в сочетании с некоторой функцией apply над mat.list, которая выполняет:

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

где здесь mat - это всего лишь единственный элемент из mat.list, должен работать, но, очевидно, мне нужна небольшая помощь, чтобы заставить его работать.


person user1701545    schedule 20.02.2014    source источник


Ответы (2)


Как только вы поймете, что это просто перестановка блочно-диагональной матрицы, вы можете придумать что-то вроде этого:

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]
person flodel    schedule 21.02.2014

Следующее соответствует вашим потребностям ?:

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
person Georg Schnabel    schedule 21.02.2014