施密特正交化 GramSchmidt

施密特正交化 GramSchmidt

施密特正交化的原名是 Gram–Schmidt process,是由Gram和schmidt两个人一起发明的,但是后来因为施密特名气更大,所以该方法被简记为施密特正交化。

借用 《线性代数》P117-例2 的例子来运行代码。
\[ a_1 = (1,2,-1)^T \\ a_2 = (-1,3,1)^T \\ a_3 = (4,-1,0)^T \]
正交化后:
\[ a_1 = (1,2,-1)^T \\ a_2 = \frac{5}{3}(-1,1,1)^T \\ a_3 = 2(1,0,1)^T \]
单位化后:
\[ a_1 = \frac{1}{\sqrt{6}}(1,2,-1)^T \\ a_2 = \frac{1}{\sqrt{3}}(-1,3,1)^T \\ a_3 = \frac{1}{\sqrt{2}}(4,-1,0)^T \]

代码实现

python3 的 sympy 包实现了 GramSchmidt 方法。

from sympy.matrices import Matrix, GramSchmidt
l = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]
o = GramSchmidt(l)

计算结果如下:

[Matrix([
 [ 1],
 [ 2],
 [-1]]), 
 Matrix([
 [-5/3],
 [ 5/3],
 [ 5/3]]), 
 Matrix([
 [2],
 [0],
 [2]])]

单位化也就是在调用函数的时候传入参数。

from sympy.matrices import Matrix, GramSchmidt
l = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]
o = GramSchmidt(l, True)

计算结果如下:

[Matrix([
[ sqrt(6)/6],
[ sqrt(6)/3],
[-sqrt(6)/6]]), 
Matrix([
[-sqrt(3)/3],
[ sqrt(3)/3],
[ sqrt(3)/3]]), 
Matrix([
[sqrt(2)/2],
[        0],
[sqrt(2)/2]])]

sympy.Matrix 与 Numpy 的互操作

Matrix 转 Numpy.array

import numpy as np
from sympy.matrices import Matrix, GramSchmidt
l = [Matrix([1,2,-1]), Matrix([-1,3,1]), Matrix([4,1,0])]
o = GramSchmidt(l, True)
m = np.array(o)

内积计算

(m[0] * m[1]).sum()

References

[1] https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process

[2] GramSchmidt. sympy: https://docs.sympy.org/latest/modules/matrices/matrices.html?highlight=gramschmidt#sympy.matrices.dense.GramSchmidt

转载于:https://www.cnblogs.com/fengyubo/p/10516798.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值