软考考点之矩阵乘法

如2019年上半年软考第65题

第64题:已知矩阵Am*n和Bn*p相乘的时间复杂度为O(mnp)。矩阵相乘满足结合律,如三
个矩阵A、B、C相乘的顺序可以是(A*B)*C也可以是A*(B*C)。不同的相乘顺序所需进行的乘
法次数可能有很大的差别。因此确定n个矩阵相乘的最优计算顺序是一个非常重要的问题。已
知确定n个矩阵A 1 A 2 ......A n 相乘的计算顺序具有最优子结构,即A 1 A 2 ......A n 的最优计算顺序包
含其子问题A 1 A 2 ......A k 和A k+1 A k+2 ......A n (1≤k<n)的最优计算顺序。
可以列出其递归式为:


其中,A i 的维度为p i-1 *p i ,m[i,j]表示A i A i+1 ......A j 最优计算顺序的相乘次数。
先采用自底向上的方法求n个矩阵相乘的最优计算顺序。则求解该问题的算法设计策略为(
)。算法的时间复杂度为( ),空间复杂度为( )。
给定一个实例,(p 0 p 1 ......p 5 )=(20,15,4,10,20,25),最优计算顺序为( )。
答:第一空,告诉你了是自底向下方法,那么算法策略,很明显是 动态规划

矩阵的维度是指什么呢?

我们通常会说矩阵的维度,这里的维度也不是指的空间,而是指矩阵的行数。

关于算法的时间复杂度详解:

根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵A的行数和另一个矩阵B的列数相等时才能定义。如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵,它的一个元素其中 1 ≤ i ≤ m, 1 ≤ j ≤ p。如图1

值得一提的是,矩阵乘法满足结合律和分配率,但并不满足交换律,如下图所示的这个例子,两个矩阵交换相乘后,结果变了:

其实,通过前面的分析,我们已经很明显的看出,两个具有相同维数的矩阵相乘,其复杂度为O(n^3).即从图1,可以看出c[i][j]=a[i][k]*b[k][j],与三个变量i,k,j相关,所以得用三重循环。

相应的空间复杂度,可以从结果c[i][j]处看到只有两个变量i,j,所以空间复杂度是O(n^2).

最后一个空(p 0 p 1 ......p 5 )=(20,15,4,10,20,25),求最优计算顺序:若没研究过矩阵,此题是没法解的……,这就是知识肓区,时常看看这些,一定会有所收获。

可以构造出的矩阵为{   20 15    }{    15  4  } {     4  10  } {      10  20  }  {       20   25 } 五个矩阵。分别为A1~A5

看别人的视频说是相乘看哪个最小就可以了

待续吧…………不知所以然

又如2016年下半年第65题

第65题:两个矩阵A m*n 和B n*p 相乘,用基本的方法进行,则需要的乘法次数为m*n*p。多个矩阵
相乘满足结合律,不同的乘法顺序所需要的乘法次数不同。考虑采用动态规划方法确定M i ,
M (i+1) ,...,Mj多个矩阵连乘的最优顺序,即所需要的乘法次数最少。最少乘法次数用m[i,j]表
示,其递归式定义为:


其中i、j和k为矩阵下标,矩阵序列中Mi的维度为(pi-1)*pi采用自底向上的方法实现该算法来确
定n个矩阵相乘的顺序,其时间复杂度为(64)。若四个矩阵M1、 M2、M3、M4相乘的维度序
列为2、6、3、10、3,采用上述算法求解,则乘法次数为(65)

答:如上题,复杂度为O(n^3)

可以构造出的矩阵为{   2    6    }{    6  3 } {    3   10  } {      10  3 }  四个矩阵

前两个相乘,根据时间复杂度公式,可以得出次数为2*6*3=36

后两个相乘   3*10*3=90

前两矩阵相乘,其实得{2 3},后两个矩阵得{3,3}

结果 再相乘,得2*3*3=18   最后将相乘次数相加 90+36+18=126+18=144

算结果次数的依据就是  根据wikipedia上的介绍:两个矩阵的乘法仅当第一个矩阵A的行数和另一个矩阵B的列数相等时才能定义。如A是m×n矩阵,B是n×p矩阵,它们的乘积AB是一个m×p矩阵

待续吧…………其实还是不知所以然

 

矩阵乘法的实质:

先看一个例子:

如何得出的呢?过程如下: 2*1+1*1=3           2*2+1*0=4

                                                      4*1+3*1=7     4*2+3*0=8即第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。

如何理解呢?参见:https://nolaymanleftbehind.wordpress.com/2011/07/10/linear-algebra-what-matrices-actually-are/

只列出关键的部分:

矩阵最基本的应用是求解线性方程组。如 

可以用矩阵重写为:

矩阵的应用远远超出了这个简单的问题,但是现在我们将以此为动机。让我们回到了解什么是矩阵。要了解矩阵,我们必须知道向量是什么。

真正的向量空间基本上就是您想到的空间。数字线是一维实向量空间,xy平面是二维实向量空间,三维是3维实向量空间,依此类推。如果您在学校里学习过向量,那么您可能会熟悉将其视为箭头,可以将它们加在一起,乘以实数等等,但是将向量相乘的工作原理有所不同。这听起来很熟悉吗?这应该。矩阵就是这样工作的,这不是巧合。

扩展:

 

加法 = 移动

矩阵的加法可以理解成向量的连续移动。向东走 50 米,再向南走 15 米,再向东走 20 米,这就是三个向量相加,用矩阵来表示就是加法,结果就是你最后停留的点。

比如:

3                2                        3+2

1       +       4   =                  1+4

 

我们可以这样理解:

  • 把笔点在原点0,0  ,然后移动到3,1,然后再往右上移动两个「日字格」,即2,4 。

由此可知:

  • 矩阵加法双方必须行列数一致
  • 加法两边矩阵的顺序可以交换

对于多列的矩阵加法,我们大可以理解成对多个向量同时进行移动。至于减法,则可以转写成加法和负数,然后代表反向移动。

 

 

乘法(与数字)= 伸缩

前面说过了标量的问题。任何一个向量都可以视作是对基的伸缩。比如 

3

1     

 实际上就是横向伸长三个格子,纵向一个格子,最右边格子右上角的这个位置。也就是横向伸长至三倍,纵向伸长一倍。

注:这里的基其实是 

0     1                           0    1                             1

1     0     (基)  *  0     3             =         3

矩阵最基本的乘法是和数字相乘。对于向量来说,这个乘法就是对这个向量各维度的同时「伸缩」,乘以不同的数字代表伸缩的程度,大于 1 是伸长,1 代表按兵不动,小于 1 是缩回,0 是回归原点,负数则以原点为中间点反向伸长。

如2  *  1                         2*1                       2

               3       =             2*3             =      6          

 

乘法(同维度) = 换基

矩阵的乘法可以理解成把原来 

 0     1

1      0

 的基换成新的。

由于基就是单位,所以基的替换就是让原来的坐标转移到新的坐标系里面去。这样的转移不仅包含了终点,而且包含了转移的方向

3        2                      3                         3                             2                             3*3+1*2                11

1       6           *         1              =3  *  1          +        1  *   6            =              3*1+1*6           =   9

换句话说,换基的实质,就是分别缩放各个维度,得出原向量的新位置。这也意味着做乘法的时候最好按列来写算式。

如果是 2X2的矩阵乘以  2X2的矩阵,又怎么理解呢?对了,那可不就是把两个向量的基都给替换一次么。

也就是说,任意 nXn 的矩阵,可以与任意 nXm 且 m>=1的矩阵相乘,意思是把 m 个向量的基统统换掉。这也意味着两个向量A  和 B 相乘的时候,A 的列(基的数量)必须与 B 的行(维度数量)相等,这个计算才有意义。

 

乘法(不同维度)= 换基并升降维

若3

    1   换基成

「3   2」

这时候会发生什么呢?这时候原来的二维向量会被「降维」。由于目标空间只有一维,所以原来的横纵轴标量 3 和 1 会被「折叠」到仅剩的一根轴上。这就要求你能想象这种空间的升降维行为。

要思考多个维度中千奇百怪的变化,以及多个维度相互升降,是相当困难而且让人丧失信心的。实际上最好的办法,就是你只想象最基本和简单的情况,而其他复杂的情况,你则「相信」这个算法是可靠的,就行了。

 

参见https://zhuanlan.zhihu.com/p/23417744

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

guangod

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值