矩陣乘法詳解


首先要知道矩陣是怎么相乘的

首先,兩個矩陣要是想相乘需要滿足,第一個矩陣的列數等於第二個矩陣的行數
滿足的話就可以相乘得到新的矩陣了。

舉個例子嗷:

矩陣\(a\)

1 2 3
3 2 2
2 1 2

矩陣\(b\)

2 2
3 1
2 1

\(a\)矩陣是\(3 * 3\)\(3\)\(3\)列)的矩陣,\(b\)矩陣是\(3 * 2\)\(3\)\(2\)列)的矩陣,滿足第一個矩陣的列數等於第二個矩陣的行數。那我們就可以相乘了
一個\(m*n\)的矩陣和一個\(n*p\)的矩陣相乘,將會得到一個\(m*p\)的矩陣
相乘得到的矩陣\(c\)\(3*2\)的:

14 7
16 10
11 7

其實就是矩陣\(a\)的第一行每個元素分別與\(b\)的第一列相乘再求和,得到\(c\)矩陣的第一個數,然后\(a\)矩陣的第一行再與\(b\)矩陣的第二列相乘,得到第二個數,然后是\(a\)矩陣的第二行與\(b\)矩陣的第一列…

不明白的看下邊吧

1 * 2 + 2 * 3 + 3 * 2 = 14
1 * 2 + 2 * 1 + 3 * 1 = 7
3 * 2 + 2 * 3 + 2 * 2 = 16
3 * 2 + 2 * 1 + 2 * 1 = 10
2 * 2 + 1 * 3 + 2 * 2 = 11
2 * 2 + 1 * 1 + 2 * 1 = 7

好了,懂了怎么相乘就來看題吧…

先看這道題…

題目描述
矩陣\(A\)規模是\(n×m\),矩陣\(B\)規模是\(m×p\),現在需要你求\(A*B\)

輸入
輸入\(n,m\)。然后輸入\(n×m\)的矩陣。

輸入\(p\),然后輸入\(m×p\)的矩陣。

\(1<=n,m,p<=100\)

\(-10000<=\)矩陣元素\(<=10000\)

輸出
輸出相乘后的\(n×p\)的矩陣

樣例輸入

2 3
1 2 3
3 2 1
2
1 1
2 2
3 3

樣例輸出

14 14
10 10
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], b[N][N], c[N][N];
int n, m, p;
int main() {
    cin >> n >> m; //矩陣a為n*m(n行m列)
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];

    cin >> p; //矩陣b為m*p(m行p列)
    for (int i = 0; i < m; i++)
        for (int j = 0; j < p; j++)
            cin >> b[i][j];

    //結果是n行p列的,所以外面兩層循環是n和p
    //最后一層循環是m,因為(n,m),(m,p),所以(i,k)一組,(k,j)一組
    for (int i = 0; i < n; i++)     //矩陣c是a與b相乘得到的
        for (int j = 0; j < p; j++) // n*p(n行p列)
            for (int k = 0; k < m; k++)
                c[i][j] += a[i][k] * b[k][j]; //乘法再sum求和

    //輸出
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < p; j++)
            cout << c[i][j] << " ";
        cout << endl;
    }
    return 0;
}

這一題根上面那一道沒什么區別…

L1-048 矩陣\(A\)乘以\(B\)
給定兩個矩陣\(A\)\(B\),要求你計算它們的乘積矩陣\(AB\)。需要注意的是,只有規模匹配的矩陣才可以相乘。即若\(A\)\(R​_a\)行、\(C​_a\)​​列,\(B\)\(R​_b\)行、\(C​_b\)​​ 列,有\(C​_a\)​與\(R​_b\) 相等時,兩個矩陣才能相乘。

輸入格式:
輸入先后給出兩個矩陣\(A\)\(B\)。對於每個矩陣,首先在一行中給出其行數\(R\)和列數\(C\),隨后\(R\)行,每行給出\(C\)個整數,以\(1\)個空格分隔,且行首尾沒有多余的空格。輸入保證兩個矩陣的\(R\)\(C\)都是正數,並且所有整數的絕對值不超過\(100\)

輸出格式:
若輸入的兩個矩陣的規模是匹配的,則按照輸入的格式輸出乘積矩陣\(AB\),否則輸出Error: C_a != R_b,其中\(C_a\)\(A\)的列數,\(R_b\)\(B\)的行數。

輸入樣例1:

2 3
1 2 3
4 5 6
3 4
7 8 9 0
-1 -2 -3 -4
5 6 7 8

輸出樣例1:

2 4
20 22 24 16
53 58 63 28

輸入樣例2:

3 2
38 26
43 -5
0 17
3 2
-11 57
99 68
81 72

輸出樣例2:

Error: 2 != 3
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int a[N][N], b[N][N], c[N][N];
int n, m, p, q;

int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            cin >> a[i][j];

    cin >> p >> q;
    for (int i = 0; i < p; i++)
        for (int j = 0; j < q; j++)
            cin >> b[i][j];

    if (m != p)
        cout << "Error: " << m << " != " << p;
    else {
        cout << n << " " << q << endl;
        for (int i = 0; i < n; i++)
            for (int j = 0; j < q; j++)
                for (int k = 0; k < m; k++)
                    c[i][j] += a[i][k] * b[k][j];

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < q; j++) {
                if (j == q - 1)
                    cout << c[i][j]; //注意每行最后一個數字后沒有空格
                else
                    cout << c[i][j] << " ";
            }
            if (i != n - 1)
                cout << endl;
        }
    }
    return 0;
}

矩陣乘法是一種巧妙地方式將加法轉化成乘法的方式,以便在較短的方式解決遞推問題。

對於這種加法形遞推式,一般都可以使用矩陣乘法加速遞推

矩陣乘法滿足結合律,不滿足一般的交換律。

利用結合律,矩陣乘法可以利用 快速冪 的思想來優化。

在比賽中,由於線性遞推式可以表示成矩陣乘法的形式,也通常用矩陣快速冪來求線性遞推數列的某一項


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM