1

我有三个大矩阵:I、G 和 G^2。这些是 400 万 x 400 万矩阵,它们是稀疏的。我想检查它们是否是线性独立的,我想在 R 中做到这一点。

对于小矩阵,一种方法是对每个矩阵进行向量化:将列堆叠在一起,并测试由三个堆叠向量形成的矩阵是否具有三阶。

但是,由于我的问题的规模,我不知道如何进行。

(1) 有没有办法在 R 中将大稀疏矩阵向量化为非常大的稀疏向量?

(2) 是否有任何其他解决方案可以使该测试有效?

提前致谢

4

1 回答 1

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,你可以检查线性依赖关系是否也适用于大向量.)

于 2013-05-20T14:29:52.577 回答