我有三个大矩阵:I,G和G ^ 2。这些是4Million x 4Million矩阵,它们很稀疏。我想检查它们是否是线性独立的,我想在R中这样做。
对于小矩阵,一种方法是对每个矩阵进行矢量化:将列堆叠在彼此之上并测试由三个堆叠矢量形成的矩阵是否具有等级3。
但是,由于问题的严重性,我不知道该怎么办。
(1)有没有办法将大型稀疏矩阵矢量化为R中的超大稀疏矢量?
(2)是否有任何其他解决方案可以使此测试有效?
提前致谢
答案 0 :(得分:2)
将矩阵转换为向量时,只能保留非零元素。
# 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,你可以检查线性依赖关系是否也适用于大向量。)