r-如何从矩阵::qr()中获得枢轴和秩,就像从基本矩阵::qr()中获取枢轴和秩一样



当对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因子分解返回的rankpivot是有用的。但我认为这就是你想要的:

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

最新更新