施密特正交化 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–Schmidt_process
[2] GramSchmidt. sympy: https://docs.sympy.org/latest/modules/matrices/matrices.html?highlight=gramschmidt#sympy.matrices.dense.GramSchmidt