如何在Scipy对称正交化后保持向量顺序?
实现保持原向量顺序的矩阵正交化
scipy.linalg.orth基于SVD实现正交化,会按奇异值降序排列正交向量,但如果需要保持原矩阵列向量的顺序生成正交基,可以使用改进版Gram-Schmidt正交化,它会严格按照原列的顺序逐个生成正交向量。
解决方案:实现改进版Gram-Schmidt正交化
以下是针对需求的代码实现:
import numpy as np def orth_preserve_order(A, rtol=1e-12): # 复制矩阵避免修改原数据 Q = A.copy().astype(np.float64) n, m = Q.shape orth_basis = [] for i in range(m): # 当前待正交化的向量 v = Q[:, i] # 减去在已生成正交基上的投影 for q in orth_basis: v -= np.dot(v, q) * q # 计算向量范数,判断是否线性相关 norm = np.linalg.norm(v) if norm > rtol: orth_basis.append(v / norm) # 将正交基转换为矩阵(每列为一个正交向量) return np.column_stack(orth_basis)
测试示例矩阵
用你提供的矩阵测试:
import scipy.linalg as sl A = np.array([[5,0,0],[0,2,0],[0,0,4]]) # 使用自定义函数 result = orth_preserve_order(A) print(result)
输出结果:
[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.]]
这个结果完全符合你想要的保持原向量顺序的正交化结果。
说明
- 改进版Gram-Schmidt相比原始算法有更好的数值稳定性,适合实际计算场景。
- 函数中的
rtol参数用于判断列向量是否线性相关,低于阈值的线性相关向量会被跳过,和scipy.linalg.orth的行为一致。 - 该方法严格遵循原矩阵列的顺序生成正交基,不会调整向量的排列顺序。
内容的提问来源于stack exchange,提问作者张亦弛
相关产品推荐
相关产品推荐

