給定n個矩陣:a1,a2,…,an,其中ai與ai+1是可乘的,i=1,2…,n-1。確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。
矩陣乘法
在矩陣乘法中,第乙個矩陣的行數和第二個矩陣的列數必須是相同的。先來看乙個簡單的例子:
之所以這樣要求,是因為矩陣的乘法定義中,就要求了,第乙個矩陣每一行和第二個矩陣每一列相對應位置的數字做乘的操作:
如果a矩陣是p×q的矩陣,b是q×r的矩陣,那麼乘積c是p×r的矩陣。它們一共計算了p×q×r次。
以下是一段計算兩個矩陣乘積的標準演算法:
void matrixmultiply(int matrixa, int matrixb,int matrixc,int ra, int ca, int rb, int cb) // end if
for (int i = 0; i < ra; i++) // end for
matrixc[i][j] = sum;}}
}
順序安排
假設給定3個矩陣,a、b、c,它們的規模分別是10×100、100×5和5×50。
- 如果按照((ab)c)的順序計算:
為計算ab(規模10×5),需要做10×100×5=5000次標量乘法,再與c相乘又需要做10×5×50=2500次標量乘法,共需要7500次標量乘法。
- 如果按照(a(bc))的順序計算:
為計算bc(規模100×50),需要做100×5×50=25000次標量乘法,再與a相乘又需要做10×100×50=50000次標量乘法,共需要75000次標量乘法。
因此,按第一種順序計算矩陣連乘要比第二種順序快10倍。所以,進行一些計算來確定最有順序還是值得的。
設mleft,right是進行矩陣乘法aleftaleft+1···aright-1aright所需要的乘法次數。為一致起見,mleft,left=0。設最後的乘法是(aleft···ai)(ai+1aright),其中 left ≤ i ≤ right。
此時所用的乘法次數為:mleft,i + mi+1,right + cleft-1cicright。這三項分別代表計算(aleft···ai)、(ai+1aright)以及它們的乘積所需要的乘法。除了最後的答案,還要顯示實際的乘法順序,所以我們還要記錄i的值,由此得到以下演算法:
public
static
void
optmatrix(int c, long m, int lastchange)
for (int k = 1; k <= n; k++)
}} // end inner for
} // end outer for
}
這個程式包含三重巢狀迴圈,容易看出它以o(n3)時間執行。這裡其實有更快地演算法,但由於執行具體矩陣乘法的時間仍然很可能會比計算最有順序的乘法的時間多得多,所以這個演算法還是挺實用的。 矩陣鏈乘法問題
問題描述 詳見演算法導論p197 p198 已知 給定n個矩陣構成的乙個矩陣鏈 a1,a2,an 矩陣ai的維數為pi 1 pi 求 決定該矩陣鏈的乘法結合順序 即加括號 使得矩陣鏈乘法的執行時間最短 幾個前提概念 首先判斷是否具有最優子結構假設ai.aj的矩陣鏈乘法的最優解是在ak與ak 1之間分...
矩陣鏈乘法問題 (演算法)
一 概述 以兩個矩陣相乘為例,a1 a2,a1和a2為兩個矩陣,假設a1的行列數是p q,a2的行列數是q r。注意這裡由於是a1乘以a2,所以a1的列數要等於a2的行數,否則無法做矩陣乘法,滿足上述條件的矩陣,我們稱之為 相容 的。那麼對於a1 a2而言,我們需要分別執行p r次對應a1的行元素乘...
矩陣乘法 矩陣乘法的基本實現
求解關於兩個矩陣的乘積 參考線性代數裡面的兩個矩陣相乘的規則,我這裡不再贅述,詳情附上了乙個鏈結,我的程式設計也是用了裡面的例子 這裡寫鏈結內容 具體的過程我會在 片裡面加上注釋 矩陣乘法 author seen 2015 09 18 include using namespace std int ...