【问题标题】:repeat a matrix many times and get a vector of matrix names多次重复一个矩阵,得到一个矩阵名称的向量
【发布时间】:2012-10-25 05:31:17
【问题描述】:

我有一个基本矩阵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给出一个错误:要替换的项目数不是替换长度的倍数。我真正希望通过这些编码得到的是块对角矩阵。谢谢:)

【问题讨论】:

  • (mat, mat, ..) 是什么意思?你的意思是你想得到一个rows x 100*cols 矩阵吗? 100*rows x cols 矩阵退出? x[[1]] == mat 的列表在哪里?你能举一个简单的例子(比如一个 2x3 矩阵)以及“采用矩阵名称向量的函数”是什么? (注意,矩阵名称的向量与矩阵的向量不同!(我什至不知道您所说的“矩阵向量 names”是什么意思 - 你的意思是字符串 'mat '?))
  • @mathematical.coffee:感谢 cmets!实际上,我计划使用的函数需要一个矩阵列表作为其参数,它将根据这些传递的矩阵生成一个大块对角矩阵。我希望传递给函数的是矩阵名称 mat 的重复 100 次。

标签: r


【解决方案1】:

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

让我在块对角矩阵上引用两个资源。

1)Wikipedia:

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

2) 函数blockMatrixDiagonal的说明:

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


您可以将非方阵与包magic 中的函数adiag 结合使用。用你的矩阵x:

library(magic)
do.call(adiag, replicate(100, x, simplify = FALSE))

【讨论】:

  • 感谢 cmets!是的,我意识到blockMatrixDiagonal 函数只接受方阵。但是,也许术语“块诊断矩阵”不是很合适,但是可以将非方阵制作为“块”,然后制作一个类似于块对角线的矩阵,所有其他元素 == 0。我用bdiag 中的 Matrix 函数,但它返回一个无法传递给我的函数的 S4 对象...
【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 1970-01-01
    • 2021-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多