在scipy/numpy中处理n > m的矩形矩阵的QR分解

4 投票
1 回答
2312 浏览
提问于 2025-04-18 18:23

我有一个 m 行 n 列的矩阵 A,其中 n 大于 m。给定矩阵 A 的秩 r(r 小于等于 m),经过简化的 QR 分解后,会得到一个 m 行 r 列的矩阵 Q 和一个 r 行 n 列的矩阵 R。矩阵 Q 的列构成了矩阵 A 的范围的正交归一基。矩阵 R 会是上三角形的,但呈现阶梯状。R 中有主元的列对应于矩阵 A 中的独立列。

当我使用 numpy.linalg 中的 qr 函数(scipy.linalg 中也有这个函数,似乎是一样的)时,它返回的矩阵 Q 是 m 行 m 列的,而矩阵 R 是 m 行 n 列的,即使矩阵 A 的秩小于 m。这似乎是“完整”的 QR 分解,其中 Q 的列构成了 R^m 的正交归一基。通过 numpy.linalg 或 scipy.linalg 中的 qr 函数返回的 R 矩阵,是否可以识别出矩阵 A 中的独立列呢?

1 个回答

2

检查矩阵R中非零的对角元素:

import numpy as np
min_tol = 1e-9
A = np.array([[1,2,3],[4,3,2],[1,1,1]])
print("Matrix rank of: {}".format(np.linalg.matrix_rank(A)))
Q,R = np.linalg.qr(A)
indep = np.where(np.abs(R.diagonal()) >  min_tol)[0]
print(A[:, indep])
print("Independent columns are: {}".format(indep))

另外可以参考这里: 如何在协方差矩阵中找到退化的行/列

撰写回答