矩阵连乘思路
https://blog.csdn.net/qq_32919451/article/details/80643118?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-1.no_search_link&spm=1001.2101.3001.4242
【問題描述】
給定n個矩陣{A1,A2,…,An},其中Ai與Ai+1是可乘的,i=1,2…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如,給定三個連乘矩陣{A1,A2,A3}的維數分別是10100,1005和550,采用(A1A2)A3,乘法次數為101005+10550=7500次,而采用A1(A2A3),乘法次數為100550+10100*50=75000次乘法,顯然,最好的次序是(A1A2)A3,乘法次數為7500次。
分析:
矩陣鏈乘法問題描述:
給定由n個矩陣構成的序列{A1,A2,…,An},對乘積A1A2…An,找到最小化乘法次數的加括號方法。
1)尋找最優子結構
此問題最難的地方在于找到最優子結構。對乘積A1A2…An的任意加括號方法都會將序列在某個地方分成兩部分,也就是最后一次乘法計算的地方,我們將這個位置記為k,也就是說首先計算A1...Ak和Ak+1...An,然后再將這兩部分的結果相乘。
最優子結構如下:假設A1A2…An的一個最優加括號把乘積在Ak和Ak+1間分開,則前綴子鏈A1…Ak的加括號方式必定為A1…An的一個最優加括號,后綴子鏈同理。
開始并不知道k的確切位置,需要遍歷所有位置以保證找到合適的k來分割乘積。
2)構造遞歸解
- m[i][j] 表示A[i:j]的計算量 ;
- A[i:k]的計算量為m[i][k];
- A[k+1 : j]的計算量為m[k+1][j]
因此,m[i][j] = m[i][k] + m[k+1][j] + p[i-1] * p[i] * p[j];
因為i、j是矩陣的下標所以是大于0的,比如矩陣是A1-A6 i=1,j=6
其中p是每個矩陣的行數和列數如下圖
(p[i-1] * p[i] * p[j]:最后兩個矩陣的計算量)
此時i=1,j=6
假設 此時k的位置(括號的位置)在p3,所以計算量就是min(m[1][3]+m[4][6]+p[0]p[3]p[6])
計算順序
矩陣A1-A6,可以看出k的范圍在p1-p5間
i=1,j=6,n=6,所以k的范圍i<=k<j-1
總結
- 上一篇: 加载torchvision中预训练好的模
- 下一篇: 正确率 精度 召回率 错误率