如何在Python中实现Matlab风格的QR分解?含指定命令等效需求
Python实现Matlab风格的QR分解
一、稀疏矩阵带列置换的QR分解(对应[C,R,P] = qr(S,B))
Matlab的[C,R,P] = qr(S,B)针对稀疏矩阵S,通过列置换P减少R中的填充,进而求解稀疏线性方程组S*X=B的最小二乘解。在Python中,scipy.sparse.linalg.qr完全支持该功能:
- 核心用法:
Q, R, p = sparse.linalg.qr(S, pivoting=True)- 这里的
p是列置换的索引数组(对应Matlab中置换矩阵P的列索引,即S[:, p] = Q @ R) - 计算
C = Q.T @ B,对应Matlab中的C - 求解三角方程组:
y = scipy.linalg.solve_triangular(R, C) - 还原最小二乘解
X:通过索引置换直接赋值X = np.zeros_like(y); X[p] = y,或构造置换矩阵P = sparse.csc_matrix((np.ones(len(p)), (p, np.arange(len(p)))))后计算X = P @ y
- 这里的
示例代码:
import numpy as np from scipy import sparse from scipy.sparse.linalg import qr from scipy.linalg import solve_triangular # 构造稀疏矩阵S和右端项B S = sparse.random(100, 100, density=0.1, format='csc') B = np.random.rand(100, 1) # 带列置换的稀疏QR分解 Q, R, p = qr(S, pivoting=True) # 计算C并求解中间变量y C = Q.T @ B y = solve_triangular(R, C) # 还原得到最小二乘解X X = np.zeros_like(y) X[p] = y # 最小二乘验证 print(np.linalg.norm(S@X - B))
二、经济型带列置换的QR分解(对应[Q, R, E] = qr(X,0);)
Matlab的qr(X,0)是经济型QR分解(仅保留必要的Q、R子矩阵),结合列置换E实现X*E=Q*R。Python中用numpy.linalg.qr,配合mode='economic'和pivoting=True参数即可实现:
- 核心用法:
Q, R, p = np.linalg.qr(X, mode='economic', pivoting=True)p是列置换的索引数组,对应Matlab中置换矩阵E的列索引(即X[:, p] = Q @ R)- 若需要显式构造置换矩阵E,可执行
E = np.eye(X.shape[1])[:, p]
示例代码:
import numpy as np # 构造稠密矩阵X X = np.random.rand(10, 6) # 经济型带列置换的QR分解 Q, R, p = np.linalg.qr(X, mode='economic', pivoting=True) # 构造对应Matlab的置换矩阵E E = np.eye(X.shape[1])[:, p] # 分解有效性验证 print(np.linalg.norm(X@E - Q@R))
注意事项
- 稀疏QR分解仅支持scipy兼容的稀疏矩阵格式(如CSC、CSR),优先使用CSC格式以获得更佳性能
- numpy的
qr仅支持稠密矩阵,稀疏场景必须使用scipy的稀疏QR实现
内容的提问来源于stack exchange,提问作者NC520
相关产品推荐
相关产品推荐

