【问题标题】:Matrix with diagonal pairs of 1's对角线对 1 的矩阵
【发布时间】:2012-02-01 13:22:42
【问题描述】:

假设我有以下矩阵 mat,它是一个二进制指示矩阵:

mat

> mat
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    1    0    0    0    0
[2,]    0    0    1    1    0    0
[3,]    0    0    0    0    1    1

这个矩阵只有 3 行。我需要创建一个有 10000 行的行,对角线上的一对 1 的模式相同。 例如。对于 5 行,我期望一个 5 x 10 矩阵:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    1    0    0    0    0    0    0    0     0
[2,]    0    0    1    1    0    0    0    0    0     0
[3,]    0    0    0    0    1    1    0    0    0     0
[4,]    0    0    0    0    0    0    1    1    0     0
[5,]    0    0    0    0    0    0    0    0    1     1

有没有人知道一个简单的方法来做到这一点? 非常感谢

【问题讨论】:

  • 即取单位矩阵并复制每一列

标签: r matrix sparse-matrix indicator


【解决方案1】:

这是一个稀疏矩阵,因此,您可以更好地引用非零条目:这将节省您的 RAM 并使自动生成矩阵变得更容易。

每个条目都被索引为 (i,j,x),指的是行、列和值。假设您有 N(例如 N = 10)行要填充,那么您每行生成 2 个条目(由i 索引,在下面的代码中);每列仅使用一次,因此有 2*N 个唯一列值。每个非零条目都是 1。

产生这个的代码是:

N = 10
i = rep(1:N, each = 2)
j = 1:(2*N)
v = 1

library(Matrix)
mat = sparseMatrix(i = i, j = j, x = v)

得到的矩阵是:

> mat
10 x 20 sparse Matrix of class "dgCMatrix"

 [1,] 1 1 . . . . . . . . . . . . . . . . . .
 [2,] . . 1 1 . . . . . . . . . . . . . . . .
 [3,] . . . . 1 1 . . . . . . . . . . . . . .
 [4,] . . . . . . 1 1 . . . . . . . . . . . .
 [5,] . . . . . . . . 1 1 . . . . . . . . . .
 [6,] . . . . . . . . . . 1 1 . . . . . . . .
 [7,] . . . . . . . . . . . . 1 1 . . . . . .
 [8,] . . . . . . . . . . . . . . 1 1 . . . .
 [9,] . . . . . . . . . . . . . . . . 1 1 . .
[10,] . . . . . . . . . . . . . . . . . . 1 1

只需使用上面的代码并设置 N = 10000,你就会得到你的矩阵。

额外的好处:您想要的矩阵 (N = 1E5) 仅消耗 321424 字节。相比之下,大小为 10K x 20K 的标准密集矩阵将占用 1.6GB,使用数字(即 8 字节)条目。正如他们在“联系方式”中所说的那样:这似乎非常浪费空间,对吧?

【讨论】:

    【解决方案2】:

    当您没有提供足够的元素来填充矩阵时,它们会被回收:如果您提供两个 1 和 n 个零(第一行和第二行的前两个元素),您将获得所需的矩阵。

    n <- 5
    matrix( 
      c(1,1,rep(0,2*n)), 
      byrow=TRUE, nr=n, nc=2*n 
    )
    

    【讨论】:

    • 非常感谢您的快速答复。我的问题定义不明确。我编辑了它。最佳/粉丝
    • @user1182757:我已编辑我的答案以匹配您的问题。
    【解决方案3】:

    除非您打算在矩阵中填充许多其他值,否则您可能需要 Iterator 的稀疏矩阵解决方案。也就是说,这是一种生成矩阵的非稀疏版本的好方法:

    double_diag <- function(n)
    {
      matrix(rep(diag(n), each = 2), byrow = TRUE, nrow = n)
    }
    double_diag(5)
    

    【讨论】:

      【解决方案4】:

      @VincentZooneKynd 有一个很好的解决方案,但它会发出警告。这是避免警告的变体:

      n <- 5
      matrix(rep(c(1,1,rep(0,2*n)), len=2*n*n), n, byrow=TRUE)
      

      【讨论】:

        【解决方案5】:

        诡计:

        > n <- 5
        > t(model.matrix(~0+gl(n,2)))[,]
                  1 2 3 4 5 6 7 8 9 10
        gl(n, 2)1 1 1 0 0 0 0 0 0 0  0
        gl(n, 2)2 0 0 1 1 0 0 0 0 0  0
        gl(n, 2)3 0 0 0 0 1 1 0 0 0  0
        gl(n, 2)4 0 0 0 0 0 0 1 1 0  0
        gl(n, 2)5 0 0 0 0 0 0 0 0 1  1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-05-21
          • 2021-09-30
          • 2016-02-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多