動態規劃之矩陣連乘問題的兩個矩陣相乘

2021-07-27 19:44:15 字數 1513 閱讀 9107

矩陣連乘簡介詳細例子以及解析**測試結果

給定n個矩陣,其中,ai與ai+1是可乘的,i=1,2,….n-1。

由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有不同的計算次序。

矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。

若a是乙個p×q矩陣,b是乙個q×r矩陣,則其乘積c=ab是乙個p×r矩陣。在上述計算c的標準演算法中,主要計算量在3重迴圈,總共需要p×q×r次數乘。

兩個矩陣相乘計算:

下面舉具體例子:

首先定義乙個陣列a[max][max]用來儲存乙個矩陣的數值。

再定義乙個陣列b[max][max]用來儲存另乙個矩陣的數值。

最後再定義乙個陣列c[max][max]用來儲存兩個矩陣相乘的結果。

前面提到這個**需要三重迴圈:

第一重是矩陣相乘中的a的資料,因為a陣列是一行一行與b陣列相乘的,所以判斷條件是a的行數

第二重是矩陣相乘中的b的資料,因為b陣列是一列一列與a陣列相乘的,所以判斷條件是b的列數

第三重是根據列出的資料得出的規律,由上圖可以看出結果是由兩部分相加得到的。因此可一在第三重迴圈前解決前一部分的問題,在第三重迴圈裡面解決第二部分的問題。

#include

#include

#define max 100

void matrixmultiply(int a[max], int b[max], int c[max], int ra, int ca, int rb, int cb)

for (i = 0; i < ra; i++) //a是一行一行與b相乘的

//這行**解決的是後一部分a的列數大於0的,b的行數大於0的

c[i][j] = sum;}}

}int main(void)

}puts("請輸入矩陣b的具體資料;");

for (i = 0; i < rb; i++)

}matrixmultiply(a, b, c, ra, ca, rb, cb);

printf("矩陣相乘的結果:\n");

動態規劃之矩陣連乘問題

在動態規劃演算法中,區域性最優並不一定會使得全域性最優,它在每乙個階段的決策都會影響到後面的決策。所以我們在將問題劃分為若干階段時,需要將各個階段所發生的不同狀態儲存起來,提供後一階段做決策。一般都是子問題重疊的時候使用動態規劃。下面是乙個矩陣連乘的問題。問題 n個矩陣連乘問題 描述 矩陣連乘滿足結...

動態規劃之矩陣連乘問題

矩陣連乘問題是通過給矩陣連乘時加括號,使得總的計算量最小。考慮3個矩陣相乘的例子,a1,a2,a3,假設這3個矩陣的維數分別為 10x100,100x50,5x50 若按照 a1a2 a3 方式計算,需要的數乘次數為10x100x5 10x5x50 7500 若按照 a1 a2a3 方式計算,需要的...

動態規劃之矩陣連乘問題

給定 n 個矩陣 其中 a i 與 a 是可乘的 i 1,2,ldots,n 1 矩陣 a i 的維數為 p p i,i 1,2,ldots,n 考察這 n 個矩陣的連乘積 a 1a 2 ldots a n 要求通過新增括號使得矩陣連乘時,數乘次數最少。例如連乘積 a 1a 2a 3a 4 可以有以...