5

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

mat<-matrix(c(1, 1, 0, 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

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

4

5 回答 5

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 字节。相比之下,大小为 10K x 20K 的标准密集矩阵将占用 1.6GB,使用数字(即 8 字节)条目。正如他们在“联系”中所说:这似乎是对空间的极大浪费,对吧?

于 2012-02-01T13:57:18.613 回答
1

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

n <- 5
matrix(rep(c(1,1,rep(0,2*n)), len=2*n*n), n, byrow=TRUE)
于 2012-02-01T18:49:08.873 回答
1

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

n <- 5
matrix( 
  c(1,1,rep(0,2*n)), 
  byrow=TRUE, nr=n, nc=2*n 
)
于 2012-02-01T13:31:21.987 回答
1

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

double_diag <- function(n)
{
  matrix(rep(diag(n), each = 2), byrow = TRUE, nrow = n)
}
double_diag(5)
于 2012-02-01T16:45:31.337 回答
0

诡计:

> 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
于 2017-11-11T14:42:25.580 回答