向量空间
定义1
向量空间是一个集合 V V V,该集合的元素都是向量,定义了加法和标量乘法,则向量空间满足:
- 集合 V V V对加法运算封闭,即集合 V V V中的任意向量 P P P和 Q Q Q,它们的和 P + Q P+Q P+Q也是集合 V V V的向量
- 集合 V V V对标量乘法运算封闭,即对于任意实数 a a a和集合 V V V中的任意向量 P P P,它们的积 a P aP aP也是集合 V V V的向量
- 集合 V V V中存在0向量,即对于集合 V V V中的任意向量 P P P,有 P + 0 = 0 + P = P P+0 = 0+P= P P+0=0+P=P成立
- 对于集合 V V V中的任意向量 P P P,在集合 V V V中存在向量 Q Q Q,使 P + Q = 0 P+Q = 0 P+Q=0
- 集合 V V V中的向量满足结合律,即对于集合 V V V中的任意向量 P P P, Q Q Q和 R R R, ( P + Q ) + R = P + ( Q + R ) (P+Q)+R = P+(Q+R) (P+Q)+R=P+(Q+R)成立
- 标量乘法满足结合律,即对于任意实数 a a a和 b b b,以及集合 V V V中的任意向量 P P P, a b P = a ( b P ) abP = a(bP) abP=a(bP)成立
- 标量与向量和的乘法满足分配律,即对于任意实数 a a a,以及集合 V V V中的任意向量 P P P和 Q Q Q, a ( P + Q ) = a P + a Q a(P+Q) = aP+aQ a(P+Q)=aP+aQ成立
- 标量和与向量的乘法满足分配律,即对于任意实数 a a a和 b b b,以及集合 V V V中的任意向量 P P P, ( a + b ) P = a P + b P (a+b)P = aP+bP (a+b)P=aP+bP成立
定义2
对于含有 n n n个向量的集合 { e 1 , e 2 , ⋯ , e n } \{e_1,e_2,\cdots,e_n\} {e1,e2,⋯,en},如果不存在不全为0的数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an,使等式
a 1 e 1 + a 2 e 2 + ⋯ + a n e n = 0 a_1e_1+a_2e_2+\dots+a_ne_n=0 a1e1+a2e2+⋯+anen=0
成立,则称向量集合线性无关,否则称为线性相关
一个 n n n维向量空间可以由 n n n个线性无关向量的集合生成,生成向量空间的线性无关向量的集合称为线性空间的基
定义3
向量空间 V V V的基 B \mathcal{B} B是 n n n个线性无关向量的集合, B = { e 1 , e 2 , ⋯ , e n } \mathcal{B}=\{e_1,e_2,\cdots,e_n\} B={e1,e2,⋯,en},对于向量空间中的任意向量 P P P,存在一组实数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1,a2,⋯,an,使
P = a 1 e 1 + a 2 e 2 + ⋯ + a n e n P =a_1e_1+a_2e_2+\dots+a_ne_n P=a1e1+a2e2+⋯+anen
成立
一个 n n n维向量空间有无穷多个基,每个基中有且仅有 n n n个向量
定义4
向量空间的基 B \mathcal{B} B中,如果任意两个向量 e i e_i ei和 e j e_j ej, i ≠ j i\neq j i=j,且 e i ⋅ e j = 0 e_i\cdot e_j=0 ei⋅ej=0,则基 B \mathcal{B} B称为向量空间的正交基
对于向量空间的正交基,如果其中每个向量的长度都为1,则称为规范正交基
规范正交基使用克罗内克函数函数表示
在数学中,克罗内克函数(又称克罗内克 δ \delta δ函数、克罗内克 δ \delta δ)是一个二元函数,得名于德国数学家利奥波德·克罗内克。克罗内克函数的自变量(输入值)一般是两个整数,如果两者相等,则其输出值为1,否则为0。
克罗内克函数使用符号 δ i j \delta_{ij} δij表示
δ i j = { 1 ,如果 i = j 0 ,如果 i ≠ j \delta_{ij}= \begin{cases} 1,如果i=j\\ 0,如果i\neq j \end{cases} δij={1,如果i=j0,如果i=j
定义5
向量空间的基 B = { e 1 , e 2 , ⋯ , e n } \mathcal{B}=\{e_1,e_2,\cdots,e_n\} B={e1,e2,⋯,en}中,如果任意两个向量 e i e_i ei和 e j e_j ej, i ≠ j i\neq j i=j,且 e i ⋅ e j = δ i j e_i\cdot e_j=\delta_{ij} ei⋅ej=δij,则基 B \mathcal{B} B称为向量空间的规范正交基
基到正交基的变换
最后给出向量空间基到正交基的Gram-Schmidt 正交化算法
向量空间的基 B = { e 1 , e 2 , ⋯ , e n } \mathcal{B}=\{e_1,e_2,\cdots,e_n\} B={e1,e2,⋯,en},计算后的向量空间的基 B ′ = { e 1 ′ , e 2 ′ , ⋯ , e n ′ } \mathcal{B}^{'}=\{e_1^{'},e_2^{'},\cdots,e_n^{'}\} B′={e1′,e2′,⋯,en′}
- 令 e 1 ′ = e 1 e_1^{'} = e_1 e1′=e1
- i i i=2
- 从向量 e i e_i ei中减去向量在 e 1 ′ , e 2 ′ , ⋯ , e i − 1 ′ e_1^{'},e_2^{'},\cdots,e_{i-1}^{'} e1′,e2′,⋯,ei−1′上的投影,结果保存到 e i ′ e_{i}^{'} ei′中
- 如果 i < n i<n i<n, i i i加1,转到步骤3
向量 e i e_i ei在向量 e ′ e^{'} e′上的投影利用点乘即可计算
e i ′ = e i ⋅ e ′ ∣ e ′ ∣ e ′ ∣ e ′ ∣ = e i ⋅ e ′ e ′ ⋅ e ′ e ′ e_{i}^{'} = \frac{e_i\cdot e^{'}}{|e^{'}|}\frac{e^{'}}{|e^{'}|} = \frac{e_i\cdot e^{'}}{e^{'}\cdot e^{'}}e^{'} ei′=∣e′∣ei⋅e′∣e′∣e′=e′⋅e′ei⋅e′e′
我们以三维空间为例,给出基到正交基的C语言实现
#include <stdio.h> #include <string.h> // 向量点乘,n表示维度 float dot(const float* v1, const float* v2, int n); // 向量相加:desm表示des的系数,srcm表示src的系数,n表示维度 void add(float* des, float desm, const float* src, float srcm, int n); //Gram-Schmidt算法,n表示维度 void gramSchmidt(float* des, const float* src, int n); int main(void) { float a1[9] = {1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 1.0, 1.0}; float a2[9] = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}; gramSchmidt(a2, a1, 3); return 0; } float dot(const float* v1, const float* v2, int n) { // 这里应该使用simd运算 float res = 0; for(int i = 0; i < n; i++) { res += (*(v1 + i)) * (*(v2 + i)); } return res; } void add(float* des, float desm, const float* src, float srcm, int n) { for(int i = 0; i < n; i++) { *(des + i) = (*(des + i)) * desm + (*(src + i)) * srcm; } } void gramSchmidt(float* des, const float* src, int n) { int perSize = n * sizeof(float); memcpy(des, src, perSize); if(n <= 1) { return; } for(int i = 1; i < n; i++) { memcpy(des + n * i, src + n * i, perSize); for(int j = 0; j < i; j++) { float a1 = dot(des + n * i, des + n * j, n); float a2 = dot(des + n * j, des + n * j, n); add(des + n * i, 1, des + n * j, -(a1 / a2), n); } } }
我们使用三维向量
[ 1.0 , 0.0 , 0.0 ] [1.0, 0.0, 0.0] [1.0,0.0,0.0]
[ 1.0 , 1.0 , 0.0 ] [1.0, 1.0, 0.0] [1.0,1.0,0.0]
[ 1.0 , 1.0 , 1.0 ] [1.0, 1.0, 1.0] [1.0,1.0,1.0]
经过算法后得到三维正交基向量
[ 1.0 , 0.0 , 0.0 ] [1.0, 0.0, 0.0] [1.0,0.0,0.0]
[ 0.0 , 1.0 , 0.0 ] [0.0, 1.0, 0.0] [0.0,1.0,0.0]
[ 0.0 , 0.0 , 1.0 ] [0.0, 0.0, 1.0] [0.0,0.0,1.0]