Julia中如何求指定秩矩阵的列空间与行空间的基向量?
实现方案
方法1:基于列选主元QR分解(计算速度快)
列选主元的QR分解会自动将线性无关的列优先排列,只需提取分解得到的正交矩阵Q的前r列即可得到列空间的正交基:
using LinearAlgebra # 对矩阵A做列选主元QR分解 qr_fact = qr(A, ColumnNorm()) # 获取矩阵真实秩 r = rank(A) # 列空间基:每一列对应一个基向量,维度为(n, r) col_space_basis = qr_fact.Q[:, 1:r] # 如果需要行空间基,对A的转置做相同操作即可 row_space_basis = qr(transpose(A), ColumnNorm()).Q[:, 1:r]
方法2:基于SVD分解(数值稳定性最优)
SVD是求矩阵基最稳定的方案,非零奇异值对应的左奇异向量张成列空间,右奇异向量张成行空间,完全可以满足你的需求:
using LinearAlgebra svd_fact = svd(A) r = rank(A) # 列空间基:左奇异矩阵前r列,维度(n, r) col_space_basis = svd_fact.U[:, 1:r] # 行空间基:右奇异矩阵前r列,维度(m, r) row_space_basis = svd_fact.V[:, 1:r]
效果验证
针对你给出的秩为3的测试矩阵,以上两种方法得到的基向量数量均为3,可通过下面代码验证基的正确性:
# 验证列空间一致:拼接A和基矩阵的秩和A本身的秩相等 @assert rank([A col_space_basis]) == r
内容的提问来源于stack exchange,提问作者Physics_Student
相关产品推荐
相关产品推荐

