我有三个大矩阵:I, G和G^2。这些是400万x 400万矩阵,它们是稀疏的。我想检查它们是否线性无关我想在r中做这个
对于小矩阵,一种方法是对每个矩阵进行矢量化:将列堆叠在一起,并测试由三个堆叠向量组成的矩阵是否具有第3阶。
然而,由于我的问题的大小,我不知道如何进行。
(1)是否有一种方法可以将一个大的稀疏矩阵矢量化成R中的一个非常大的稀疏向量?
(2)是否有其他的解决方案可以使这个测试有效?
Thanks in advance
将矩阵转换为向量时,只能保留非零元素。
# Sample data
n <- 4e6
k <- n
library(Matrix)
I <- spMatrix(n, n, 1:n, 1:n, rep(1,n))
G <- spMatrix(n, n,
sample(1:n, k, replace=TRUE),
sample(1:n, k, replace=TRUE),
sample(0:9, k, replace=TRUE)
)
G2 <- G %*% G
G2 <- as(G2, "dgTMatrix") # For the j slot
# Only keep elements that are non-zero in one of the 3 matrices
i <- as.integer( c(G@i, G2@i, I@i) + 1 )
j <- as.integer( c(G@j, G2@j, I@j) + 1 )
ij <- cbind(i,j)
rankMatrix( cbind( G2[ij], G[ij], I[ij] ) ) # 3
# Another example
m <- ceiling(n/2)-1
G <- spMatrix(n, n,
c(1:n, 2*(1:m)),
c(1:n, 2*(1:m)+1),
rep(1, n+m)
)
G2 <- as(G %*% G, "dgTMatrix")
i <- c(G@i, G2@i, I@i) + 1
j <- c(G@j, G2@j, I@j) + 1
ij <- cbind(i,j)
rankMatrix( cbind( G2[ij], G[ij], I[ij] ) ) # 2
(为了加快速度,你可以只取这些向量的一小部分:如果秩已经是3,你就知道它们是独立的,如果为2,则可以检查线性相关关系是否也适用于大向量。