如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 会被「折叠」到仅剩的一根轴上。这就要求你能想象这种空间的升降维行为。
要思考多个维度中千奇百怪的变化,以及多个维度相互升降,是相当困难而且让人丧失信心的。实际上最好的办法,就是你只想象最基本和简单的情况,而其他复杂的情况,你则「相信」这个算法是可靠的,就行了。