返回顶部

矩阵链乘法

两个矩阵的乘积:

​ 已知\(A\)\(p \times r\)的矩阵,\(B\)\(r\times q\)的矩阵,则\(A\)\(B\)的乘积是一个\(p \times q\)的矩阵,记为\(C\)

\[C = A_{p\times r} \times B_{r\times q} =(c_{ij})_{p\times q} \]

其中\(c_{ij} = \sum_{1\leq k \leq r} a_{ik}b_{kj} , \forall 1 \leq i \leq p , 1\leq j \leq q\)

每个\(c_{ij}\)的计算需要\(r\)次乘法(另有\(r-1\)次加法,这里仅考虑元素的标量乘法),则计算\(C\)共需要\(pqr\)次标量乘法运算。

\(n\)个要连续相乘的矩阵构成一个矩阵链\(<A_1,A_2,…,A_n>\),要计算这\(n\)个矩阵的连乘乘积:\(A_1A_2...A_n\),称为矩阵链乘问题。

  • 矩阵链乘满足结合律,不满足交换律。

  • 矩阵链乘过程相当于在矩阵之间加适当的括号,从而根据组合关系定义出矩阵链乘的计算模式。

如,已知四个矩阵\(A_1,A_2,A_3,A_4\),乘积\(A_1 A_2 A_3 A_4\)可用五种不同的加括号方式完成:

\[(A_1(A_2(A_3A_4)))\\ (A_1((A_2A_3)A_4))\\ ((A_1A_2)(A_3A_4)) \\ ((A_1(A_2A_3))A_4)\\ (((A_1A_2)A_3)A_4) \]

给定\(n\)个矩阵的链,记为\(<A_1,A_2,…,A_n>\),其中\(i=1,2,…,n\),矩阵\(A_i\)的维数为\(p_{i - 1} \times p_i\)。求一个完全“括号化方案”,使得计算乘积\(A_1A_2…A_n\)所需的标量乘法次数最小。

  1. 最优化方案的结构特征——寻找最优子结构

    用记号\(A_{i , j}\)表示子问题\(A_iA_{i+1}…A_j\)通过加括号后得到的一个最优计算模式,且该计算模式下的最大区间恰好在\(A_k\)\(A_{k+1}\)之间分开,则有:

    \[(\overline{A_iA_{i + 1}...A_k} )(\overline{A_{k + 1}...A_j}) \]

    则必须有:\((\overline{A_iA_{i + 1}...A_k} )\)必是“前缀”子链\(A_iA_{i+1}…A_k\)的一个最优的括号化子方案,记为\(A_{i , k}\);同理\((\overline{A_{k + 1}...A_j})\) 也必是“后缀”子链\(A_{k+1}A_{k+2}…A_j\)的一个最优的括号化子方案,记为\(A_{k+ 1 , j}\)

    证明:反证法

    如若不然,设\(A_{i , k}^{'}\)\(<A_i,A_{i+1},…A_k>\)一个代价更小的计算模式,则由\(A_{i, k}^{'}\)\(A_{k + 1 , j}\)构造计算过程\(A_{i , j}^{'}\),代价将比\(A_{i , j}\)小,这与\(A_{i , j}\)是最优链乘模式相矛盾。对\(A_{k + 1 , j}\)亦然。——这一性质称为(该问题的)最优子结构性。

  2. 递归求解方案

    \(m[i , j]\)为计算矩阵链\(A_{i , j}\)所需的标量乘法运算次数的最小值,则递推关系式为:

    \[m[i , j] = \begin{cases} 0 & i = j\\ min_{i \leq k < j} \{m[i , k] + m[k + 1 , j] + p_{i - 1}p_kp_j\} & i < j \end{cases} \]

    含义:

    • 对任意的\(i\leq k<j\)分开的子乘积,\(A_{i , k}\)是一个\(p_{i-1}\times p_k\)的矩阵,\(A_{k+1,j}\)是一个\(p_k\times p_j\)的矩阵 。结果矩阵\(A_{i,j}\)\(A_{i,k}\)\(A_{k+1,j}\)最终相乘的结果。

    • \(m[i,j]\)和任意\(k\)所分开的矩阵链乘\(<A_i,A_{i+1},…, A_j>\)\(m[i,j]\)等于计算子乘积\(A_{i,k}\)最小代价$m[i,k] + $ 计算子乘积\(A_{k+1,j}\)的最小代价\(m[k+1,j]+\)这两个子矩阵最后相乘的代价\(p_{i-1}p_kp_j\),而这样的\(k\)\(j-i\)种可能性,取其中最小者。

    • \(m[1,n]\)是计算\(A_{1,2,...,n}\)的最小代价。

    再设\(s[i , j]\),记录使\(m[i,j]\)取得最小值的\(k\),则可以依靠\(s\)求出最优链乘模式
    伪代码:

时间复杂度分析:算法的主体是由一个三层循环构成。外循环执行\(n - 1\)次,内层循环至多执行\(n -1\)次,所以矩阵链乘法的算法复杂度是\(\Omega(n^3)\) ,空间复杂度为\(\Theta(n^2)\)

posted @ 2021-12-24 20:21  cherish-lgb  阅读(272)  评论(0编辑  收藏  举报