说我有以下矩阵矩阵,它是一个二进制指标矩阵:
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
有人知道这样做的简单方法吗?
非常感谢
最佳答案
这是一个稀疏的矩阵,因此,您将更好地引用非零条目:这将节省您的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的标准密集矩阵将使用数字(即8字节)条目占用1.6GB。正如他们在“联系方式”中所说的那样:这似乎是在浪费大量的空间,对吗?
关于r - 对角线矩阵为1的矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9096508/