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

如何在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,提问作者张亦弛

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:32:06