0

我有一个基本矩阵mat,我希望得到一个重复 100 次x = (mat, mat, ...)的R 对象。mat如果这是可能的,那么我可以传递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给出一个错误:要替换的项目数不是替换长度的倍数。我真正希望通过这些编码得到的是块对角矩阵。谢谢 :)

4

2 回答 2

2

您的输入矩阵不适合构建块对角矩阵,因为它不是方阵(即行数等于列数)。

让我引用两个关于块对角矩阵的资源。

1)维基百科

块对角矩阵是块矩阵,它是方阵,并且具有主对角块方阵

2) 功能说明blockMatrixDiagonal

构建一个块矩阵,其对角线是提供的方阵.


您可以将非方阵与adiagpackage中的函数结合起来magic。使用您的矩阵x

library(magic)
do.call(adiag, replicate(100, x, simplify = FALSE))
于 2012-10-25T09:42:30.583 回答
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
于 2014-10-11T22:24:08.297 回答