我试图通过动态编程来理解下面的矩阵乘法算法。
如果mi, j
是评估产品Mi × ... × Mj
的最低费用,那么:
算法:
for i := 1 to n do
mi,i := 0
for length := 1 to n-1 do
for i := 1 to n-length do
j := i + length
mi,j = MINi≤k<j{mi,k + mk+1,j + ri-1rkrj}
关于它如何实际运作的任何线索,或者是否有人可以指出我的一个很好的参考。
答案 0 :(得分:2)
该算法找到了乘以矩阵链的最低成本。
给定带有A
行和p
列的矩阵q
,以及带有B
行和q
列的矩阵r
标准矩阵乘法A·B
需要p*q*r
次乘法 - 对于产品的每个p×r
条目,q
在A
的相应行的元素之间进行乘法运算相应的B
列。
现在,矩阵乘法是关联的,因此您可以将产品括起来
M_1 · M_2 · … · M_n
如你所愿,它总会产生相同的结果。
现在,让r_0
为M_1
和r_i
的行数M_i
的列数(也必须是{{}的行数1}}用于定义产品。
然后M_(i+1)
是M_i · … · M_k
矩阵,r_(i-1)×r_k
是M_(k+1) · … · M_j
矩阵。因此,如果通过首先计算产品r_k×r_j
和M_i · … · M_j
然后将两个结果矩阵相乘来计算乘积M_i · … · M_k
,则乘法的总成本为
M_(k+1) · … · M_j
其中c_{i,k} + c_{k+1,j} + r_(i-1)×r_k×r_j
是所选择的计算c_{i,k}
方式的费用(与M_i · … · M_k
类似)。
现在,如果以最低成本评估两个子产品,那么通过c_{k+1,j}
之后的拆分来评估M_i · … · M_j
的最低成本显然会实现。
通过计算所有可能拆分的最低成本,可以找到评估M_k
的最低成本,所以
M_i · … · M_j
代表m_{i,j} = min { m_{i,k} + m_{k+1,j} + r_(i-1)×r_k×r_j : i <= k < j }
。
然后计算完整产品的最低成本,首先计算仅涉及两个矩阵的子产品的最低成本[其中只有一个可能的分割],然后对于使用三个矩阵的子产品,我们需要只有两个矩阵的子产品的最低成本 - 这就是括号内所起作用的地方,通常会有所不同 - 然后是四等等,直到找到总计算的最低成本。
要找到产生最低成本的括号,您可以搜索最小成本数组来处理产生它的分裂[然后是两个子产品等],但最好存储信息在i < j
数组中,以最小成本和最小成本分割的位置。
答案 1 :(得分:0)
我不喜欢复制和粘贴,我会保持简短并用自己的话说:
这个问题的关键点是:计算A * B * C只有两种可能的方式:A *(B * C)或(A * B)* C.类似地,计算A * B * C * D只有三种方式:A *(B * C * D),(A * B)*(C * D),(A * B * C)* D. (注意:(B * C * D)和(A * B * C)这里是一个子问题并且之前已经计算过了)
因此,计算M1 * M2 * ... Mn具有n-1种可能性:M1 (M2 * M3 * ... * Mn),(M! M2)(M3 * ... * Mn),...,(M1 * M2 * ... * Mn-1)* Mn
这就是你给定的伪代码中的内容:)