• 【理解线性代数】(四)从向量组点乘到矩阵相乘


    1. 批量化的发展趋势

    工业生产的发展趋势总是从单件生产到批量生产。科学技术研究也是一样,总是从简单计算到复合运算、批量运算。批量意味着生产能力、处理能力的提升。计算机从16位发展到64位,从单核发展到多核;计算机从CPU处理数据发展到GPU处理数据;大数据、人工智能领域的大模型等一些前沿的信息技术的发展都体现了这一点。

    前面我们讲了向量点乘,向量点乘向批量化发展,可以得到向量组点乘。

    2. 向量组

    向量加法和乘法,总是两两进行运算,这种运算比较简单。

    现实应用中,往往需要对很多向量组成的向量集合进行批量运算。为了研究向量的批量运算,需要将一个向量集合视为一个整体,将向量按行排列,用括号括起来,我们称之为“向量组”。

    例如下图是一个向量组,此向量组由 (a, b, c) 和 (d, e, f) 两个三维向量组成:
    ( a b c d e f )

    (abcdef)" role="presentation">(abcdef)
    (adbecf)

    向量组的行数表示向量个数,向量组的列数表示向量的维度。目前向量仅仅表示多个向量的集合,没有其他任何含义,不需要想得太复杂。

    下面将根据我们自己的理解,对向量组运算规则进行推导。

    3. 向量组运算

    3.1 向量组加法

    向量组加法很简单,将向量组中对应位置的向量相加即可。向量组相加,两个相加的向量组包含的向量个数必须相等,否则对应行会因为缺少向量而无法进行。

    可以正确进行的矩阵加法如下:
    ( a 1 b 1 c 1 d 1 e 1 f 1 ) + ( a 2 b 2 c 2 d 2 e 2 f 2 ) = ( a 1 + a 2 b 1 + b 2 c 1 + c 2 d 1 + d 2 e 1 + e 2 f 1 + f 2 )

    (a1b1c1d1e1f1)" role="presentation">(a1b1c1d1e1f1)
    +
    (a2b2c2d2e2f2)" role="presentation">(a2b2c2d2e2f2)
    =
    (a1+a2b1+b2c1+c2d1+d2e1+e2f1+f2)" role="presentation">(a1+a2b1+b2c1+c2d1+d2e1+e2f1+f2)
    (a1d1b1e1c1f1)+(a2d2b2e2c2f2)=(a1+a2d1+d2b1+b2e1+e2c1+c2f1+f2)

    无法进行的矩阵向量组加法如下:
    ( a 1 b 1 c 1 d 1 e 1 f 1 ) + ( a 2 b 2 c 2 ) = 非法

    (a1b1c1d1e1f1)" role="presentation">(a1b1c1d1e1f1)
    +
    (a2b2c2)" role="presentation">(a2b2c2)
    = 非法 (a1d1b1e1c1f1)+(a2b2c2)=非法

    3.2 向量组乘法

    3.2.1 1行3列向量组 * 1行3列向量组

    设向量组A:
    A = ( a 1 b 1 c 1 ) A=

    (a1b1c1)" role="presentation">(a1b1c1)
    A=(a1b1c1)

    和向量组B
    B = ( a 2 b 2 c 2 ) B=

    (a2b2c2)" role="presentation">(a2b2c2)
    B=(a2b2c2)

    进行乘法运算,因为每个向量组都只有一个向量,可以尝试将这两个向量进行点乘运算,即:
    A ∗ B = a 1 a 2 + b 1 b 2 + c 1 c 2 = ( a 1 a 2 + b 1 b 2 + c 1 c 2 ) A * B = a1a2 + b1b2 + c1c2 = (a1a2 + b1b2 + c1c2) AB=a1a2+b1b2+c1c2=(a1a2+b1b2+c1c2)

    结果是一个一维向量。

    分析:
    向量组A包含1个三维向量,向量组B包含1个三维向量,向量组B可以代表三维空间中的一个一维子空间,所以A中的所有向量投影到B,投影后的向量为一维空间中的一维向量。

    3.2.2 2行3列向量组 * 1行3列向量组

    增加向量组A的行数,设向量组A:
    A = ( a 1 b 1 c 1 d 1 e 1 f 1 ) A=

    (a1b1c1d1e1f1)" role="presentation">(a1b1c1d1e1f1)
    A=(a1d1b1e1c1f1)

    和向量组B
    B = ( a 2 b 2 c 2 ) B=

    (a2b2c2)" role="presentation">(a2b2c2)
    B=(a2b2c2)

    进行乘法运算,将A中每个向量分别与B中的每个向量进行点乘运算,结果为:
    A ∗ B = ( a 1 a 2 + b 1 b 2 + c 1 c 2 d 1 a 2 + b 1 b 2 + c 1 c 2 ) A * B =

    (a1a2+b1b2+c1c2d1a2+b1b2+c1c2)" role="presentation">(a1a2+b1b2+c1c2d1a2+b1b2+c1c2)
    AB=(a1a2+b1b2+c1c2d1a2+b1b2+c1c2)

    结果是一个2行1列的向量组。

    分析:
    向量组A包含2个三维向量,向量组B包含1个三维向量,向量组B可以代表三维空间中的一个一维空间,所以A中的所有向量投影到B,最终的结果变成了2个一维向量,符合我们对向量点乘的理解。

    3.2.3 2行3列矩阵 * 2行3列矩阵

    设向量组A:
    A = ( a 1 b 1 c 1 d 1 e 1 f 1 ) A=

    (a1b1c1d1e1f1)" role="presentation">(a1b1c1d1e1f1)
    A=(a1d1b1e1c1f1)

    和向量组B
    B = ( a 2 b 2 c 2 d 2 e 2 f 2 ) B=

    (a2b2c2d2e2f2)" role="presentation">(a2b2c2d2e2f2)
    B=(a2d2b2e2c2f2)

    进行乘法运算,将A中每个向量分别与B中的每个向量进行点乘运算,结果为:
    A ∗ B = ( a 1 a 2 + b 1 b 2 + c 1 c 2 a 1 d 2 + b 1 e 2 + c 1 f 2 d 1 a 2 + e 1 b 2 + f 1 c 2 d 1 d 2 + e 1 e 2 + f 1 f 2 ) A * B =

    (a1a2+b1b2+c1c2a1d2+b1e2+c1f2d1a2+e1b2+f1c2d1d2+e1e2+f1f2)" role="presentation">(a1a2+b1b2+c1c2a1d2+b1e2+c1f2d1a2+e1b2+f1c2d1d2+e1e2+f1f2)
    AB=(a1a2+b1b2+c1c2d1a2+e1b2+f1c2a1d2+b1e2+c1f2d1d2+e1e2+f1f2)

    结果是一个2行2列的向量组。

    分析:
    向量组A包含2个二维向量,向量组B包含2个三维向量,向量组B可以代表三维空间中的一个二维平面空间(两条线组成一个面),向量组B中的两个向量,分别成为了二维空间中的坐两个标轴,这两个坐标轴不一定垂直。所以,A中的所有向量投影到B,最终的结果变成了2个二维向量,符合我们对向量点乘的理解。

    这个向量组乘法稍微有些复杂,但相乘过程中有一个量没变,那就是向量组A中向量的个数等于投影结果向量组中向量的个数,即向量组A的行数等于投影结果向量组的行数。投影前后维度可能会变化,但是向量个数始终是不变的,因为投影各投各的,互不干扰。

    在行数相等不变的情况下,只能将向量点乘的结果按列依次向后摆放,最终,结果向量组的列数,和向量组B的行数一定相同,读者可以自己演算一遍,加深理解。

    3.2.4 向量组不能相乘的情况

    如果两个向量组列数不同,也就是维度不同,还能相乘吗?

    不能,因为向量点乘要求两个向量具有相同的维度。如果两个向量组列数不同,向量组中的向量互相无法点乘。不同维度的向量,坐标个数不一样,无法做乘法。

    所以,两个向量组相乘,必须乘号两边的向量组有相同的维度。

    3.2.5 推广


    A ∗ B = C A * B = C AB=C
    为例。

    只要向量组A和向量组B的列数相同,不管向量组A、向量组B各自有多少行,都可以进行相乘。并且有:

    • 结果向量组C包含的向量个数和A中的向量个数相同,投影过程是一个线性变换,向量个数不会增加也不会减少,故投影前后向量个数不变。
    • 结果向量组C的向量维度和矩阵B的维度相同,因为向量组C包含的向量,是向量组A向向量组B的投影,所以它们全部位于向量组B所代表的空间中,所以C和B的维度必然相同。
    3.2.6 验证复杂向量组相乘:2行3列向量组 * 3行3列向量组

    设向量组A:
    A = ( a 1 b 1 c 1 d 1 e 1 f 1 ) A=

    (a1b1c1d1e1f1)" role="presentation">(a1b1c1d1e1f1)
    A=(a1d1b1e1c1f1)

    和向量组B
    B = ( a 2 b 2 c 2 d 2 e 2 f 2 g 2 h 2 i 2 ) B=

    (a2b2c2d2e2f2g2h2i2)" role="presentation">(a2b2c2d2e2f2g2h2i2)
    B= a2d2g2b2e2h2c2f2i2

    进行乘法运算,结果为:
    A ∗ B = ( a 1 a 2 + b 1 b 2 + c 1 c 2 a 1 d 2 + b 1 e 2 + c 1 f 2 a 1 g 2 + b 1 h 2 + c 1 i 2 d 1 a 2 + e 1 b 2 + f 1 c 2 d 1 d 2 + e 1 e 2 + f 1 f 2 d 1 g 2 + e 1 h 2 + f 1 i 2 ) A * B =

    (a1a2+b1b2+c1c2a1d2+b1e2+c1f2a1g2+b1h2+c1i2d1a2+e1b2+f1c2d1d2+e1e2+f1f2d1g2+e1h2+f1i2)" role="presentation">(a1a2+b1b2+c1c2a1d2+b1e2+c1f2a1g2+b1h2+c1i2d1a2+e1b2+f1c2d1d2+e1e2+f1f2d1g2+e1h2+f1i2)
    AB=(a1a2+b1b2+c1c2d1a2+e1b2+f1c2a1d2+b1e2+c1f2d1d2+e1e2+f1f2a1g2+b1h2+c1i2d1g2+e1h2+f1i2)

    结果是一个2行3列的向量组。

    分析:
    向量组A包含2个三维向量,向量组B包含3个三维向量,向量组B可以代表三维空间中的一个三维立体子空间,所以A中的所有向量投影到B,最终的结果变成了2个三维向量,符合我们对向量组点乘的理解。

    4. 矩阵与矩阵乘法

    4.1 什么是矩阵

    矩阵由向量组发展而来,它在向量组的基础上,增加了新的规则,但是本质上二者几乎是一样的。

    4.2 矩阵乘法

    理解了向量组乘法,理解矩阵乘法就非常简单了。
    以两个2行3列向量组A,B点乘为例
    A ∗ B = C A * B = C AB=C
    为例。

    我们知道,向量组A点乘向量组B,是A中的每个行代表的向量和B中的每个行代表的向量点乘。

    若将A,B视为矩阵,做矩阵乘法,但此时矩阵乘法无法进行。因为矩阵乘法规则为:乘号左边矩阵的列数必须和乘号右边矩阵的行数相等。必须将矩阵B的第一行写为第一列,第二行写为第二列…依此类推。这种将矩阵行写成列的操作叫做矩阵转置。此时,矩阵乘法变为A与B的转置矩阵相乘,相乘过程为:“将A中的每一个行所代表的向量与B中的每一列所代表的向量点乘”。

    显而易见,先将矩阵转置,再将A中的每一个行所代表的向量与B中的每一列所代表的向量点乘,和直接将A中的每个行代表的向量和B中的每个行代表的向量点乘,逻辑上是完全等价的,正因如此,矩阵相乘和向量组相乘结果是完全一样的。

    既然矩阵相乘和向量组相乘结果是一样的,那么矩阵相乘的规则是不是多此一举,把简单的问题复杂化了?可能是也可能不是,随着我们的深入探究,这个问题一定会被解决。

    由于矩阵从向量组发展而来,从几何意义上说,我们完全可以认为矩阵相乘是向量投影。

    4.3 特别矩阵乘法

    如果矩阵B为三行三列的单位矩阵(单位矩阵用E表示),即
    B = E = ( 1 0 0 0 1 0 0 0 1 ) B = E =

    (100010001)" role="presentation">(100010001)
    B=E= 100010001

    任意一个m行3列的矩阵A,乘以矩阵B,都等于矩阵A本身,即
    A ∗ B = A ∗ E = A A * B = A * E = A AB=AE=A

    这个大家可以自己尝试演算一下。我们这里不做演算,我们这里仅做理论分析:

    B矩阵为单位矩阵时,B矩阵所代表的空间,和当前的整个三维空间完全重合。矩阵A乘矩阵B,就是将矩阵A投影到原空间,而且B中每个向量的长度为1,不会改变投影后向量的长度,则投影结果必然也和A重合,也就是说结果矩阵等于A。通过分析,我们可以很容易地理解,为什么一个矩阵乘以单位矩阵,结果是它本身。


    下一篇:《矩阵乘法与仿射变换》

  • 相关阅读:
    Letcode动态规划专题-困难
    数据结构ArrayList
    14 shell编程入门-hello world
    深入剖析 Python 最常用数据结构:列表(List) & 元组(Tuple)
    VMware16虚拟机添加硬盘(磁盘)和挂载硬盘(磁盘)
    navicat中在查询当中出现报错在应使用条件的上下文(在 'AND' 附近)中指定了非布尔类型的表达式。 (4145)
    【2024年5月备考新增】】 考前篇(26)《必备资料(9) - 论文串讲-范围管理》
    在C/C++中使用vcpkg
    2022-11-02 myql-StarRocks-Join 查询优化
    PV、EV、AC、BAC、EAC、ETC等计算公式含义
  • 原文地址:https://blog.csdn.net/u012790503/article/details/132650082