我有一个基本矩阵mat
,我希望得到一个R对象x = (mat, mat, ...)
,其中mat
重复100次。如果这是可能的,那么我可以将x
传递给一个带有矩阵名称向量的函数。我试过rep(mat, 100)
,但似乎不再维护矩阵类。有什么建议?谢谢!
更新:基本上我打算使用
grp.ids <- as.factor(c(rep(1,8), rep(2,4), rep(3,2)))
x <- model.matrix(~grp.ids)
do.call(blockMatrixDiagonal,
replicate(100, x, simplify=FALSE))
可以找到blockMatrixDiagonal
函数here。然后R给出错误:要替换的项目数不是替换长度的倍数。我真正希望通过这些编码获得的是块对角矩阵。谢谢:))
答案 0 :(得分:2)
您的输入矩阵不适合构建块对角矩阵,因为它不是方阵(即行数等于列数)。
让我引用块对角矩阵的两个资源。
1)Wikipedia:
块对角矩阵是块矩阵,它是方矩阵,并且具有主对角块方块矩阵
2)函数blockMatrixDiagonal
:
构建一个块矩阵,其对角线是所提供的方阵。
您可以将非方形矩阵与包adiag
中的函数magic
结合使用。使用矩阵x
:
library(magic)
do.call(adiag, replicate(100, x, simplify = FALSE))
答案 1 :(得分:2)
对于基本R解决方案,请查看kronecker
?kronecker
# For your block diagonal matrix:
kronecker(diag(1, 100), x)
# or with `%x%` alias
diag(1, 100) %x% x
# example 1
m <- matrix(1:6, nrow = 3)
kronecker(diag(1, 2), m)
# [,1] [,2] [,3] [,4]
# [1,] 1 4 0 0
# [2,] 2 5 0 0
# [3,] 3 6 0 0
# [4,] 0 0 1 4
# [5,] 0 0 2 5
# [6,] 0 0 3 6
# example 2
matrix(1, nrow = 2, ncol = 3) %x% m
# [,1] [,2] [,3] [,4] [,5] [,6]
# [1,] 1 4 1 4 1 4
# [2,] 2 5 2 5 2 5
# [3,] 3 6 3 6 3 6
# [4,] 1 4 1 4 1 4
# [5,] 2 5 2 5 2 5
# [6,] 3 6 3 6 3 6