假设我有以下矩阵垫,这是一个二进制指示符矩阵:
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
有谁知道一个简单的方法吗? 非常感谢
答案 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