如何从Matrix::qr()中获取base::qr()式的pivot与rank?
获取稀疏矩阵QR分解的秩(rank)与主元(pivot)信息,用于检测线性相关列
1. 获取矩阵的秩(Rank)
对于Matrix包返回的sparseQR对象,有两种简便方式获取秩:
- 方法一:从QR分解的R矩阵提取
R矩阵是三角矩阵,其非零对角元的数量即为矩阵的秩(需考虑浮点精度误差):# 提取R矩阵 R <- qr.R(qrA.M) # 设置浮点精度阈值,避免因计算误差误判 rank <- sum(abs(diag(R)) > 1e-10) - 方法二:直接计算矩阵秩
使用rankMatrix()函数直接计算稀疏矩阵的秩,更简洁:rank <- rankMatrix(A.s)[1]
2. 获取主元(Pivot)信息
Matrix::qr()返回的sparseQR对象中,@p槽存储了主元的索引(注意是0起始,需转换为R默认的1起始索引):
# 提取0起始的主元索引,转换为1起始 pivot <- qrA.M@p + 1
该结果与base::qr()返回的$pivot完全对应。
3. 检测线性相关列
当矩阵的秩小于列数时,主元列表中前rank个列是线性独立的,剩余列则可由独立列线性表示(即线性相关列):
n_cols <- ncol(A.s) # 线性独立列 independent_cols <- pivot[1:rank] # 线性相关列 dependent_cols <- pivot[(rank + 1):n_cols]
针对你的示例验证
运行上述代码后,会得到:
- 秩
rank = 2 - 主元
pivot = c(3, 1, 4, 2) - 独立列
independent_cols = c(3, 1) - 相关列
dependent_cols = c(4, 2)
这与矩阵的实际线性关系一致:列2可由列3线性表示(列2 = -2 * 列3),列4可由列1线性表示(列4 = 2 * 列1)。
内容的提问来源于stack exchange,提问作者Chris Lotus
相关产品推荐
相关产品推荐

