【线性代数】标准正交矩阵与Gram-Schmidt正交化_nineheaded_bird的博客-CSDN博客_标准正交矩阵
标准正交向量组定义:任一向量的模为1(向量标准化),且任意两个向量的乘积为0(向量正交化),可通过施密特标准正交化实现。
线性无关向量组未必是正交向量组,但正交向量组又是重要的!如何从一个线性无关向量组出发,构造出一个标准正交向量组,并且使向量组和等价呢?那就是通过施密特(标准)正交化方法实现!
施密特(标准)正交化(Schmidt orthogonalization): 是求欧氏空间正交基的一种方法。从欧氏空间任意线性无关的向量组出发,求得正交向量组,使由与向量组等价,再将正交向量组中每个向量经过单位化,就得到一个标准正交向量组,这种方法称为施密特正交化。
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())
如果(E为单位矩阵,AT表示“矩阵A的转置矩阵”。)或,则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.]]