当对R中的稀疏矩阵应用矩阵::qr((时,输出与base::qr的输出截然不同。有V、β、p、R、q,但没有秩和枢轴。下面是一个小示例代码。我想检测A稀疏矩阵的线性相关列,这需要枢轴和秩。我应该如何获得这些信息?
library(Matrix)
A <- matrix(c(0, -2, 1, 0,
0, -4, 2, 0,
1, -2, 1, 2,
1, -2, 1, 2,
1, -2, 1, 2), nrow = 5, byrow = T)
A.s <- as(A, "dgCMatrix")
qrA.M <- Matrix::qr(A.s)
qrA.R <- base::qr(A)
还有另一个相关但未回答的问题,在矩阵中获取基础::qr枢轴::qr-方法
我会稍微重建一下您的示例矩阵A
:
A <- A[, c(1,4,3,2)]
# [,1] [,2] [,3] [,4]
#[1,] 0 0 1 -2
#[2,] 0 0 2 -4
#[3,] 1 2 1 -2
#[4,] 1 2 1 -2
#[5,] 1 2 1 -2
您在问题中没有提到为什么密集QR因子分解返回的rank
和pivot
是有用的。但我认为这就是你想要的:
dQR <- base::qr(A)
with(dQR, pivot[1:rank])
#[1] 1 3
因此,A
的第1列和第3列为A
的列空间提供了基础。
我真的不理解稀疏QR因子分解的逻辑。A
的第二列完全线性地依赖于第一列,所以我预计在因子分解过程中会发生列枢轴旋转。但令我惊讶的是,事实并非如此!
library(Matrix)
sA <- Matrix(A, sparse = TRUE)
sQR <- Matrix::qr(sA)
sQR@q + 1L
#[1] 1 2 3 4
未完成转向柱旋转!因此,没有一种明显的方法来确定A
的等级。
此时此刻,我只能考虑对R因子执行密集的QR因子分解,以获得您想要的内容。
R <- as.matrix(Matrix::qrR(sQR))
QRR <- base::qr(R)
with(QRR, pivot[1:rank])
#[1] 1 3
为什么这样做?好吧,Q因子具有正交的因此线性独立的列,因此R的列继承了A
的线性依赖性或独立性。对于行多于列的矩阵,这种第二次QR因子分解的计算成本可以忽略不计。
在想出更好的主意之前,我需要弄清楚稀疏QR因子分解背后的算法。
我一直在研究类似的问题,最终我不依赖Matrix::qr()
来计算秩和检测线性相关性。相反,我在程序包SSBtools
中编程了函数GaussIndependent
。
在包示例中,我包含了一个示例,该示例演示了rankMatrix(x, method = "qr")
的错误结论。输入x是一个44*20的伪矩阵。
从您的示例矩阵A.s
:开始
library(SSBtools)
GaussIndependent(A.s) # List of logical vectors specifying independent rows and columns
# $rows
# [1] TRUE FALSE TRUE FALSE FALSE
#
# $columns
# [1] TRUE TRUE FALSE FALSE
GaussRank(A.s) # the rank
# [1] 2