矩陣乘法
對於一些還沒有學習《線性代數》的盆友們,對於矩陣相乘完全不知道該怎麼操作,這就需要數學上的知識了。
首先我們需要了解矩陣的基本定義也可以說是規則吧。
矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的列數(column)和第二個矩陣的行數(row)相同時纔有意義 [1] 。一般單指矩陣乘積時,指的便是一般矩陣乘積。一個m×n的矩陣就是m×n個數排成m行n列的一個數陣。
這個是兩個行列都一樣的矩陣:
這是兩個行列不太一樣的矩陣:
規則:
1、當矩陣A的列數等於矩陣B的行數時,A與B可以相乘。
2、矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。
3、乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和。
下面是對規則3的解釋:
這個圖很形象,累乘相加就完事兒了。
下面附上C++代碼
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a[105][105] = {0};//存儲第一個矩陣
int b[105][105] = {0};//存儲第二個矩陣
int c[105][105] = {0};//存儲相乘後的矩陣
int m,n;
cout << "請輸入矩陣A的行數和列數:";
cin >> m >> n;
int o,p;
cout << "請輸入矩陣B的行數和列數:";
cin >> o >> p;
cout << "輸入矩陣A:" << endl;
for(int i = 0; i < m;i ++)
for(int j = 0; j < n; j ++)
cin >> a[i][j];
cout << "輸入矩陣B:" << endl;
for(int i = 0; i < o; i++)
for(int j = 0; j < p; j ++)
cin >> b[i][j];
for (int i = 0;i < m;i++) //累成相加
for (int j = 0;j < p;j++)
for (int l = 0;l < n;l++)
c[i][j] += a[i][l] * b[l][j];
cout << endl << "矩陣A乘以矩陣B的結果:" << endl;
for (int i = 0; i < m; i ++ ) {
for (int j = 0; j < p; j ++ )
cout << c[i][j] << " ";
cout << endl;
}
return 0;
}
給一組數據我們來測試下代碼是否正確:
附上一題:
L1-048 矩陣A乘以B (15分)
給定兩個矩陣A和B,要求你計算它們的乘積矩陣AB。需要注意的是,只有規模匹配的矩陣纔可以相乘。即若A有Ra行、Ca列,B有Rb 行、Cb 列,則只有Ca與Rb相等時,兩個矩陣才能相乘。
輸入格式:
輸入先後給出兩個矩陣A和B。對於每個矩陣,首先在一行中給出其行數R和列數C,隨後R行,每行給出C個整數,以1個空格分隔,且行首尾沒有多餘的空格。輸入保證兩個矩陣的R和C都是正數,並且所有整數的絕對值不超過100。
輸出格式:
若輸入的兩個矩陣的規模是匹配的,則按照輸入的格式輸出乘積矩陣AB,否則輸出Error: Ca != Rb
,其中Ca
是A的列數,Rb
是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
AC代碼呈上(依據模板代碼修改即可):
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a[105][105] = {0};//存儲第一個矩陣
int b[105][105] = {0};//存儲第二個矩陣
int c[105][105] = {0};//存儲相乘後的矩陣
int m,n;
// cout << "請輸入矩陣A的行數和列數:";
cin >> m >> n;
// cout << "輸入矩陣A:" << endl;
for(int i = 0; i < m;i ++)
for(int j = 0; j < n; j ++)
cin >> a[i][j];
int o,p;
// cout << "請輸入矩陣B的行數和列數:";
cin >> o >> p;
// cout << "輸入矩陣B:" << endl;
for(int i = 0; i < o; i++)
for(int j = 0; j < p; j ++)
cin >> b[i][j];
if(n != o)
{
cout << "Error: " << n <<" != " << o;
return 0;
}
for (int i = 0;i < m;i++) //累成相加
for (int j = 0;j < p;j++)
for (int l = 0;l < n;l++)
c[i][j] += a[i][l] * b[l][j];
cout << m <<" "<< p << endl;
// cout << endl << "矩陣A乘以矩陣B的結果:" << endl;
for (int i = 0; i < m; i ++ )
for (int j = 0; j < p; j ++ )
if(j != p - 1)cout << c[i][j] << " ";
else cout << c[i][j] << endl;
return 0;
}