0


python 施密特标准正交化 + 判断矩阵是否正交(亲测!)

【线性代数】标准正交矩阵与Gram-Schmidt正交化_nineheaded_bird的博客-CSDN博客_标准正交矩阵

什么是施密特标准正交化?

    标准正交向量组定义:任一向量的**模为1(向量标准化)**,且任意两个向量的**乘积为0(向量正交化)**,可通过**施密特标准正交化**实现。

  线性无关向量组未必是正交向量组,但正交向量组又是重要的!如何从**一个线性无关向量组**![\alpha_{1},\alpha_{2},...,\alpha_{m}](https://latex.codecogs.com/gif.latex?%5Calpha_%7B1%7D%2C%5Calpha_%7B2%7D%2C...%2C%5Calpha_%7Bm%7D)出发,**构造出一个标准正交向量组**![e_{1},e_{2},...,e_{m}](https://latex.codecogs.com/gif.latex?e_%7B1%7D%2Ce_%7B2%7D%2C...%2Ce_%7Bm%7D),并且使向量组![\alpha_{1},\alpha_{2},...,\alpha_{m}](https://latex.codecogs.com/gif.latex?%5Calpha_%7B1%7D%2C%5Calpha_%7B2%7D%2C...%2C%5Calpha_%7Bm%7D)和![e_{1},e_{2},...,e_{m}](https://latex.codecogs.com/gif.latex?e_%7B1%7D%2Ce_%7B2%7D%2C...%2Ce_%7Bm%7D)![(r=1,2,...,m)](https://latex.codecogs.com/gif.latex?%28r%3D1%2C2%2C...%2Cm%29)等价呢?那就是通过**施密特(标准)正交化**方法实现!

    **施密特(标准)正交化(Schmidt orthogonalization): **是求欧氏空间正交基的一种方法。从欧氏空间任意**线性无关的向量组**![\alpha_{1},\alpha_{2},...,\alpha_{m}](https://latex.codecogs.com/gif.latex?%5Calpha_%7B1%7D%2C%5Calpha_%7B2%7D%2C...%2C%5Calpha_%7Bm%7D)出发,求得**正交向量组**![\beta_{1},\beta_{2},...,\beta_{m}](https://latex.codecogs.com/gif.latex?%5Cbeta_%7B1%7D%2C%5Cbeta_%7B2%7D%2C...%2C%5Cbeta_%7Bm%7D),使由![\alpha_{1},\alpha_{2},...,\alpha_{m}](https://latex.codecogs.com/gif.latex?%5Calpha_%7B1%7D%2C%5Calpha_%7B2%7D%2C...%2C%5Calpha_%7Bm%7D)与向量组![\beta_{1},\beta_{2},...,\beta_{m}](https://latex.codecogs.com/gif.latex?%5Cbeta_%7B1%7D%2C%5Cbeta_%7B2%7D%2C...%2C%5Cbeta_%7Bm%7D)等价,再将**正交向量组中每个向量经过单位化**,就得到一个**标准正交向量组**![e_{1},e_{2},...,e_{m}](https://latex.codecogs.com/gif.latex?e_%7B1%7D%2Ce_%7B2%7D%2C...%2Ce_%7Bm%7D),这种方法称为施密特正交化。

施密特正交化的python实现

python3 的 sympy 包实现了GramSchmidt (施密特正交化)方法如下:

from sympy.matrices import Matrix, GramSchmidt
l = [Matrix([3,2,-1]), Matrix([1,3,2]), Matrix([4,1,0])]
# 注意:将数据转为Matrix格式,否则调用GramSchmidt函数会报错!
# 返回未单位化结果
o1 = GramSchmidt(l) # 注意:orthonormal默认为False,不执行单位化操作
print(o1)
# 返回单位化结果
o2 = GramSchmidt(l,orthonormal=True) # 注意:orthonormal设为True,执行单位化操作
print(o2)

计算结果如下:

# 未单位化结果
[Matrix([
 [ 3],
 [ 2],
 [-1]]),
 Matrix([
 [-1/2],
 [   2],
 [ 5/2]]),
 Matrix([
 [ 1],
 [-1],
 [ 1]])]
# 单位化结果
[Matrix([
 [3*sqrt(14)/14],
 [   sqrt(14)/7],
 [ -sqrt(14)/14]]),
 Matrix([
 [ -sqrt(42)/42],
 [2*sqrt(42)/21],
 [5*sqrt(42)/42]]),
 Matrix([
 [ sqrt(3)/3],
 [-sqrt(3)/3],
 [ sqrt(3)/3]])]

sympy.Matrix 与 Numpy 的互操作:

from sympy.matrices import Matrix, GramSchmidt
l = [Matrix([3,2,-1]), Matrix([1,3,2]), Matrix([4,1,0])]
# 返回单位化结果
o2 = GramSchmidt(l,orthonormal=True) # 注意:orthonormal设为True,执行单位化操作
m = np.array(o2)
# 内积计算,验证施密特正交化结果
print('任意两向量乘积为:',(m[0] * m[1]).sum())
print('任一向量的模为:',(m[1] * m[1]).sum())

判断矩阵是否正交

如果AA^T=E(E为单位矩阵,AT表示“矩阵A的转置矩阵”。)或A^TA=E,则n阶实矩阵A称为正交矩阵.

import numpy as np
rot_matrix = np.asarray([[ 0., -1.,  0.],
       [ 1.,  0.,  0.],
       [ 0.,  0.,  1.]])
# 判断矩阵是否正交
print(rot_matrix @ rot_matrix.T) # 方法1
print(np.dot(rot_matrix,rot_matrix.T)) # 方法2

#输出结果:
#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]

#[[1. 0. 0.]
# [0. 1. 0.]
# [0. 0. 1.]]
标签: 算法 人工智能

本文转载自: https://blog.csdn.net/xuanhaolaile/article/details/127985069
版权归原作者 Happier, 所有, 如有侵权,请联系我们删除。

“python 施密特标准正交化 + 判断矩阵是否正交(亲测!)”的评论:

还没有评论