向量空间简介

向量空间

定义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 eiej=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} eiej=δ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}

  1. e 1 ′ = e 1 e_1^{'} = e_1 e1=e1
  2. i i i=2
  3. 从向量 e i e_i ei中减去向量在 e 1 ′ , e 2 ′ , ⋯   , e i − 1 ′ e_1^{'},e_2^{'},\cdots,e_{i-1}^{'} e1,e2,,ei1上的投影,结果保存到 e i ′ e_{i}^{'} ei
  4. 如果 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=eeieee=eeeiee

我们以三维空间为例,给出基到正交基的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]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值