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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:50:26