Блочно-диагональное связывание матриц - программирование
Подтвердить что ты не робот

Блочно-диагональное связывание матриц

Имеет ли 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
4b9b3361

Ответ 1

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)), чтобы получить обычный.