You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 21:25:06