最優矩陣連乘問題

2021-06-29 12:02:17 字數 1030 閱讀 7610

1.引言  多矩陣連乘

對於一般的矩陣乘法來說,如矩陣a(m,n)與矩陣b(n,p)相乘需要進行的加法次數為m*n*p次乘法。

由於矩陣乘法滿足結合律,因此矩陣相乘的結合性,會影響整個計算表示式的乘法執行次數。

如下面的例子,其中a(10,5)、b(5,20)、c(20,3):

(1) ((ab)c) 執行乘法次數為1300次

(2) (a(bc)) 執行乘法次數為450次

2.求最優的矩陣結合表示式

(1)設矩陣連乘積aiai+1…aj簡記為a[i:j],設最優計算次序在ak和ak+1之間斷開,則加括號方式為:

((aiai+1…ak) (ak+1…aj) )

則依照這個次序,先計算a[i:k]和a[k+1:j]然後再將計算結果相乘,計算量是:

a[i:k]的計算量+a[k+1:j]的計算量+它們兩者相乘的計算量

這裡的關鍵是:計算a[i:j]的最優次序所包含的兩個子過程(計算a[i:k]和a[k+1:j])也是最優次序

(2)具體計算

設計算a[i,j]需要的乘法次數記為m[i,j]。

m[i,j] = 0;(i == j,表示乙個矩陣,當然不需要乘法運算)

m[i,j] = min(m[i,k]+m[k+1,j]+pi*pk*pj);(k在[i,j)之間取值,表示分割點的位置,求最適合的分割點使得乘法次數最少)

下面是使用動態規劃計算6個矩陣連乘的示意圖。可以使用自底向上計算,這樣矩陣的分割點好計算。如先計算01兩個矩陣乘積,在計算02三個矩陣乘積,在計算03四個矩陣乘積:

01 12 23 34 45

02 13 24 35

03 14 25

04 15

053.程式例項

程式可以根據給出的多個矩陣的行、列,生成最優結合的相乘表示式。

最優矩陣連乘

time limit 1 ms memory limit 128 mb difficulty 3 乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c...

最優矩陣連乘

乙個n m矩陣由n行m列共n m個數排列而成。兩個矩陣a和b可以相乘當且僅當a的列數等於b的行數。乙個n m的矩陣乘以乙個m p的矩陣等於乙個n p的矩陣,運算量為nmp。矩陣乘法滿足結合律,a b c可以表示成 a b c或者是a b c 兩者的運算量卻不同。例如當a 2 3 b 3 4 c 4 ...

矩陣連乘c 最優值

include include define n 20 void matrixchain int p n int n,int m n n int s n n 矩陣個數從兩個開始一次遞增 for r 2 r n r int main void 儲存矩陣的行和列陣列 int m n n 儲存矩陣與矩陣相...