C++實現矩陣乘法 | L1-048 矩陣A乘以B (15分)

矩陣乘法

對於一些還沒有學習《線性代數》的盆友們,對於矩陣相乘完全不知道該怎麼操作,這就需要數學上的知識了。
首先我們需要了解矩陣的基本定義也可以說是規則吧。

矩陣相乘最重要的方法是一般矩陣乘積。它只有在第一個矩陣的列數(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有R​b 行、Cb 列,則只有C​a與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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章