矩阵,对角线为1对

时间:2012-02-01 13:22:43

标签: r matrix sparse-matrix indicator

假设我有以下矩阵垫,这是一个二进制指示符矩阵:

  

mat< -matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1),byrow = T ,nrow = 3)

> 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

有谁知道一个简单的方法吗? 非常感谢

5 个答案:

答案 0 :(得分:4)

这是一个稀疏矩阵,因此,您可以更好地引用非零条目:这将节省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个字节。相反,使用数字(即8字节)条目,大小为10K x 20K的标准密集矩阵将占用1.6GB。正如他们在“联系方式”中所说:这似乎是对空间的极大浪费,对吗?

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

Trickly:

> 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